【问题标题】:How to check if a number has occurred a particular number of times in a list consecutively如何检查一个数字是否在列表中连续出现特定次数
【发布时间】:2019-08-17 12:12:17
【问题描述】:

给我一​​个清单:

[1 , 0 , 4 , 4 , 4 , 4 , 4 , 1]

我想编写一个程序来检查我的列表中是否存在一个连续出现 5 次的数字(数字可能因用户输入而异)并返回该数字。

在这种情况下,输出应该是 4。

Python 中是否有任何预定义的函数可以解决此类问题?

【问题讨论】:

    标签: python logic


    【解决方案1】:

    你可以像这样使用itertools.groupby()

    from itertools import groupby
    lst = [1 , 0 , 4 , 4 , 4 , 4 , 4 , 1]
    
    for number, sublist in groupby(lst):
        if len(list(sublist)) == 5:
            print(number)
    

    默认情况下,groupby() 根据相等性对连续元素进行分组,因此它非常适合您(否则,可以提供 key 参数)。

    在遍历lst 时,groupby() 函数将构造一个新的子列表并用所有彼此相等的连续值填充它。如果迭代值与前一个不同,groupby() 将产生 number 并填充相应的 sublist。即:(1, [1])(0, [0])(4, [4, 4, 4, 4, 4]),最后是(1, [1])。因此,您只需检查产生的sublistlen() 以验证它是否包含足够的元素。请注意,这些实际上不是“列表”,而是“可迭代”,因此需要调用 list()

    【讨论】:

    • 你能解释一下这行 if len(list(sublist)) == 5: 是如何工作的吗?
    • @Viper 我试图添加更多解释,但我建议您阅读更深入解释它的文档,并尝试使用此代码 sn-p 来更好地理解它工作。 ;)
    【解决方案2】:

    试试这个列表理解:

    print([v for i, v in enumerate(lst, 1) if {v} == set(lst[i:i+4])])
    

    输出:

    [4]
    

    【讨论】:

    • 这不满足“持续”的要求。
    • @Delgan 那么请您向我解释一下“持续”的要求是什么?
    • 如果我的列表像 [1 , 4, 2 ,4 , 4, 2, 5] ,这甚至会给我输出为 4 但我想检查一个数字是否连续出现一个数字次?
    • 当所讨论的数字不是整数 >= 0 时失败。例如,在 [-1, -1, -1, -1, -1] 上失败。 OP 说的是“数字”,而不是整数 >= 0。enumerate 方法不够通用。
    【解决方案3】:
    y=list(set([x[i-1] for i in range(n-1, len(x)) if x[i-n:i]==[x[i-n]]*n]))
    

    在哪里
    n - 您正在寻找的连续出现次数
    x - 您输入的列表
    y - 连续出现 n 次的元素列表

    【讨论】:

      【解决方案4】:

      Sliding window 这个问题。

      def checkList(listi, num):
          k = [listi[0]]
          nk = 0
          listo = []
          for v in listi[1:]:
              if v == k[-1]:
                  k.append(v)
              else:
                  if len(k) == num:
                      listo.append(k[-1])
                  k = [v]
          if len(k) == num:
              listo.append(k[-1])
          return listo
      
      l = [1 , 0 , 4 , 4  ,4, 4 , 4 , 1]
      print(checkList(l, 5))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-20
        • 1970-01-01
        • 1970-01-01
        • 2017-05-30
        • 2013-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多