【问题标题】:Count how many times an element appears n times in a row within a python list计算一个元素在python列表中连续出现n次的次数
【发布时间】:2021-05-07 12:00:01
【问题描述】:

我正在尝试解决以下问题:

我有一个 python list 有多个不同的元素,每个元素都可以重复:

list =  ['a', 'a', 'b', 'a', 'foo','foo','foo', 'c','foo', 'd', 'foo','foo']

我想知道某个元素的次数,例如foo 连续出现 n 次,没有计算第一次出现。因此,list 的计数如下:

list =  ['a', 'a', 'b', 'a', 'foo','foo','foo', 'c','foo', 'd', 'foo','foo']
         +0,  +0 , +0 , +0   ,+0  , +1  , +1  , +0 , +0  , +0 ,  +0  ,  +1    = 3

在这种情况下,所需的输出将是 3

有什么干净的方法吗?

我看到了this,但这是为了特定的出场次数。在我的情况下,连续出现的次数不是预先确定的。出于同样的原因,我想我也不能使用this other

【问题讨论】:

    标签: python python-3.x list


    【解决方案1】:

    通过分组

    from itertools import groupby
    l = ['a', 'a', 'b', 'a', 'foo', 'foo', 'foo', 'c', 'foo', 'd', 'foo', 'foo']
    
    
    result = sum(len(list(key))-1 for grp, key in groupby(l)
                 if grp == 'foo')  # prints 3
    

    【讨论】:

    • TIL 有一个 groupby 方法
    • 谢谢!这正是我一直在寻找的。只是一个简短的说明:如果有人遇到类似的问题但使用列表列表,您可以采取两种方法:将嵌套列表过滤为具有理解的简单列表。或者像this answer一样直接改groupby
    【解决方案2】:
    def count_function(list, target):
        if len(list) < 2:
            return 0
        val = 0
        prev = list[0]
        for elem in list[1:]:
            if elem == target and elem == prev:
                val += 1
            prev = elem
        return val
    
    list =  ['a', 'a', 'b', 'a', 'foo','foo','foo', 'c','foo', 'd', 'foo','foo']
    print(count_function(list, 'foo'))
    
    

    【讨论】:

      【解决方案3】:
      lis =  ['a', 'a', 'b', 'a', 'foo', 'foo', 'foo', 'c', 'foo', 'd', 'foo', 'foo']
      
      def count_occurence(desired):
          count = 0
          last_item = None
          for item in lis:
              if item == desired:
                  if last_item == desired:
                      continue
                  count += 1
              last_item = item
          return count
      
      print(count_occurence('foo'))
      

      【讨论】:

        【解决方案4】:

        你可以这样做:

        def special_count(l, n):
          from collections import Counter
          from itertools import groupby 
        
          s = 0
          for k, v in groupby(lst):
            if k == n:
              s += sum(1 for _ in v) - 1
          return s
        
        
        lst =  ['a', 'a', 'b', 'a', 'foo', 'foo', 'foo', 'c', 'foo', 'd', 'foo', 'foo']
        
        print(special_count(lst, 'foo'))  #_> 3
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-09
          • 2021-07-25
          • 1970-01-01
          相关资源
          最近更新 更多