检查Python列表中是否有X个连续值等于Y
我有一个列表集合,每个列表包含16个项目,我希望找到12个连续值大于或小于指定阈值的列表。现在,我已经遍历了这些列表,将大于阈值的值放在1,小于阈值的值放在-1,并且我使用下面的方法来消除那些没有12个值的值检查Python列表中是否有X个连续值等于Y,python,list,algorithm,Python,List,Algorithm,我有一个列表集合,每个列表包含16个项目,我希望找到12个连续值大于或小于指定阈值的列表。现在,我已经遍历了这些列表,将大于阈值的值放在1,小于阈值的值放在-1,并且我使用下面的方法来消除那些没有12个值的值 如果list.count(-1)>=12或list.count(1)>=12: 如何有效地检查12个连续值?(12个值可以循环)例如,这将计数 [1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1] 目前我有两个嵌套for循环,但我知道这会多次检查相同的值
如果list.count(-1)>=12或list.count(1)>=12:
如何有效地检查12个连续值?(12个值可以循环)例如,这将计数
[1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1]
目前我有两个嵌套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
只对相邻的相等元素进行分组,然后如果数据的第一个和最后一个值相等,我将从运行中提取最后一个元素,并将其添加到第一个元素(如您允许的话),然后,我检查最长运行时间是否等于或大于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
您可以在列表中循环,同时跟踪看到特定值的次数。每次看到不同的值时,此计数器都会重置(因为您正在查找连续值)
因为连续值可以循环,所以必须更加小心地使用列表索引和循环变量。循环的最大数量等于列表长度的两倍。当你还没有找到12个连续的值时,你就知道没有了。要在列表周围有一个索引循环,您可以始终应用模(%)运算符编写一个函数,该函数返回一个带有wrapparound的子列表。然后循环索引,调用函数并检查它们是否都相等。太棒了!非常感谢您的帮助:)
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