【问题标题】:How do you calculate the greatest number of repetitions in a list?您如何计算列表中的最大重复次数?
【发布时间】:2009-05-19 23:27:17
【问题描述】:

如果我在 Python 中有一个类似的列表

[1, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1]

如何计算任何元素的最大重复次数?在这种情况下,2 最多重复 4 次,1 最多重复 3 次。

有没有办法做到这一点,同时记录最长运行开始的索引?

【问题讨论】:

  • 听起来您正在寻找列表中最长的跑步;您可能需要编辑您的问题以明确说明。
  • 具体每个数的最长运行时间
  • 是的 Sparr 是正确的。有没有办法做到这一点,同时记录最长运行开始的索引?
  • @hekevintran:你应该编辑问题——而不是添加 cmets——来澄清你的问题。

标签: python list


【解决方案1】:

使用groupby,它按值对元素进行分组:

from itertools import groupby
group = groupby([1, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1])
print max(group, key=lambda k: len(list(k[1])))

下面是实际代码:

>>> group = groupby([1, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1])
>>> print max(group, key=lambda k: len(list(k[1])))
(2, <itertools._grouper object at 0xb779f1cc>)
>>> group = groupby([1, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1, 3, 3, 3, 3, 3])
>>> print max(group, key=lambda k: len(list(k[1])))
(3, <itertools._grouper object at 0xb7df95ec>)

来自 python 文档:

groupby()的操作类似 到 Unix 中的 uniq 过滤器。它 每产生一个中断或新组 时间键函数的值 变化

# [k for k, g in groupby('AAAABBBCCDAABBB')] --> A B C D A B
# [list(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D

如果您还想要最长运行的索引,您可以执行以下操作:

group = groupby([1, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1, 3, 3, 3, 3, 3])
result = []
index = 0
for k, g in group:
   length = len(list(g))
   result.append((k, length, index))
   index += length

print max(result, key=lambda a:a[1])

【讨论】:

  • 有没有办法做到这一点,并记录最长运行开始的索引?谢谢!
  • 我用解决方案更新了答案以获取索引
【解决方案2】:

循环遍历列表,跟踪当前数字、重复次数,并将其与您看到该数字重复次数最多的次数进行比较。

Counts={}
Current=0
Current_Count=0
LIST = [1, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1]
for i in LIST:
    if Current == i:
        Current_Count++
    else:
        Current_Count=1
        Current=i
    if Current_Count>Counts[i]:
        Counts[i]=Current_Count
print Counts

【讨论】:

    【解决方案3】:

    如果你只想要 any 元素(即重复次数最多的元素),你可以使用:

    def f((v, l, m), x):
        nl = l+1 if x==v else 1
        return (x, nl, max(m,nl))
    
    maxrep = reduce(f, l, (0,0,0))[2];
    

    这只计算连续重复([1,2,2,2,1,2] 的结果将是3)并且只记录最大数量的元素。

    编辑:使 f 的定义更短...

    【讨论】:

    • 似乎类似于很多 Perl 的东西? ;)
    【解决方案4】:

    这是我的解决方案:

    def longest_repetition(l):
        if l == []:
            return None
    
        element = l[0]
        new = []
        lar = []
    
        for e in l:            
            if e == element:
                new.append(e)
            else:
                if len(new) > len(lar):
                    lar = new
                new = []
                new.append(e)
                element = e
        if len(new) > len(lar):
            lar = new    
        return lar[0]
    

    【讨论】:

      【解决方案5】:

      -您可以制作列表的新副本,但具有唯一值和相应的命中列表。

      -然后获取 Max of hits 列表并从它的索引中获取您最重复的项目。

      oldlist = ["A", "B", "E", "C","A", "C","D","A", "E"]
      newlist=[]
      hits=[]
      for i in range(len(oldlist)):
          if oldlist[i] in newlist:
              hits[newlist.index(oldlist[i])]+= 1
          else:
              newlist.append(oldlist[i])
              hits.append(1);
      #find the most repeated item
      temp_max_hits=max(hits)
      temp_max_hits_index=hits.index(temp_max_hits)
      print(newlist[temp_max_hits_index])
      print(temp_max_hits)
      

      但我不知道这是最快的方法还是有更快的解决方案。 如果您认为有更快或更有效的解决方案,请告知我们。

      【讨论】:

        【解决方案6】:

        我会使用 item 的 hashmap 来反击。

        每次看到“键”连续时,增加其计数器值。如果你击中了一个新元素,请将计数器设置为 1 并继续前进。在此线性搜索结束时,您应该获得每个数字的最大连续计数。

        【讨论】:

          【解决方案7】:

          此代码似乎有效:

          l = [1, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1]
          previous = None
          
          # value/repetition pair
          greatest = (-1, -1)
          reps = 1
          
          for e in l:
              if e == previous:
                  reps += 1
              else:
                  if reps > greatest[1]:
                      greatest = (previous, reps)
          
                  previous = e
                  reps = 1
          
          if reps > greatest[1]:
              greatest = (previous, reps)
          
          print greatest
          

          【讨论】:

          • 错误,显然 OP 想要每个数字的出现。如果上面的代码是正确的,无论如何应该很容易适应它。
          猜你喜欢
          • 2013-12-27
          • 1970-01-01
          • 2017-10-06
          • 1970-01-01
          • 1970-01-01
          • 2021-07-16
          • 2018-11-15
          • 1970-01-01
          • 2021-02-05
          相关资源
          最近更新 更多