【问题标题】:Check if a Python list has X number of consecutive values equal to Y检查 Python 列表是否有 X 个等于 Y 的连续值
【发布时间】:2021-02-11 08:36:48
【问题描述】:

我有一个列表集合,每个列表包含 16 个项目,我想找到具有 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

【问题讨论】:

  • 编写一个函数,返回一个带有环绕的子列表。然后遍历索引,调用函数并检查它们是否都相等。

标签: python list algorithm


【解决方案1】:

我会按照以下方式利用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

【讨论】:

    【解决方案2】:

    如果我正确理解了你想要什么,那么这里有一些方法可以做到:

    首先您可以对列表进行排序,将每个元素按顺序排列,然后进行线性搜索并在每次与前一个列表元素的值相同时递增一个计数器

    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
    

    【讨论】:

      【解决方案3】:

      您可以循环浏览列表,同时跟踪您查看特定值的次数。每次您看到不同的值时,此计数器都会重置(因为您正在寻找连续的值)。

      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 个连续的值,您就知道没有。要在列表周围有一个索引循环,您始终可以应用模 (%) 运算符

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-31
        • 2021-08-13
        • 2015-05-07
        • 1970-01-01
        • 2019-08-18
        • 1970-01-01
        相关资源
        最近更新 更多