[英]Check if a Python list has X number of consecutive values equal to Y
我有一個列表集合,每個列表包含 16 個項目,我想找到具有 12 個連續值 > 或 < 超過指定閾值的列表。 現在,我已經遍歷了這些列表,並將 1 用於大於閾值的值,將 -1 用於小於閾值的值,並且我過去常常遵循以消除那些沒有 12 的值。
if list.count(-1) >= 12 or list.count(1) >= 12:
如何有效地檢查 12 個連續值? (可以循環 12 個值)例如這會計數
[1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1]
目前我有 2 個嵌套的 for 循環,但我知道這會多次檢查相同的值。
for i in range(16):
light = 0
dark = 0
for j in range(12):
index = i + j
if index > 15:
index -= 15
if list[index] == 1:
light += 1
elif list[index] == -1:
dark += 1
else:
break
if dark > 0 and light > 0:
break
if dark == 12 or light == 12:
return True
我會按照以下方式利用itertools.groupby
import itertools
data = [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1]
runs = [len(list(g)) for _,g in itertools.groupby(data)]
if data[0] == data[-1]:
runs[0] += runs.pop()
print(max(runs) >= 12) # True
說明:我使用itertools.groupby
來獲取運行長度(在本例中為[7,4,5]
) - itertools.groupby
只對相鄰的相等元素進行分組,然后如果data
的第一個和最后一個值相等,我從中提取最后一個元素runs
並將其添加到第一個元素(因為您允許環繞),然后我檢查最長運行是否等於或大於12
。
如果我正確理解了您想要什么,那么這里有一些方法可以做到:
首先,您可以對列表進行排序,將每個元素按順序排列,然后進行線性搜索並在每次與前一個列表元素的值相同時遞增一個計數器
a.sort()
count = 0
for i in range(16):
if count == 12:
break
if a[i - 1] == a[i]:
count += 1
另一種方法是使用模運算符,它不需要您對列表進行排序。 你可以添加一些變量來檢查你是否完成了一個完整的循環。
flag_count = 0
count = 0
i = 0
while True:
if count == 12 or flag_count == 2:
break
if a[i % 15] == a[(i + 1) % 15]:
count += 1
if i % 15 == 0:
flag_count += 1
i += 1
您可以循環瀏覽列表,同時跟蹤您看到特定值的次數。 每次您看到不同的值時,此計數器都會重置(因為您正在尋找連續的值)。
def consective_values(input_list, target_value):
i = 0
count = 0
for _ in range(2 * len(input_list)):
if input_list[i] == target_value:
count += 1
else:
count = 0
if count == 12:
return True
i = (i + 1) % len(input_list)
return False
因為連續的值可以循環,所以您必須更加小心列表索引和循環變量。 最大循環數等於列表長度的兩倍。 如果此時您還沒有找到 12 個連續的值,您就知道沒有。 要圍繞列表進行索引循環,您始終可以應用模數 (%) 運算符
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.