簡體   English   中英

檢查 Python 列表是否有 X 個等於 Y 的連續值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM