检查Python列表中是否有X个连续值等于Y

检查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循环,但我知道这会多次检查相同的值

我有一个列表集合,每个列表包含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循环,但我知道这会多次检查相同的值

                    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