如何计算列表中最大的重复次数?

时间:2009-05-19 23:27:17

标签: python list

如果我在Python中有一个列表,如

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

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

有没有办法做到这一点但是还要记录最长跑步开始的指数?

7 个答案:

答案 0 :(得分:42)

使用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])

答案 1 :(得分:3)

循环浏览列表,跟踪当前的数字,重复的次数,并将其与您重复查看该次数的次数进行比较。

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

答案 2 :(得分:1)

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

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的定义更短......

答案 3 :(得分:1)

这是我的解决方案:

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]

答案 4 :(得分:1)

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

- 然后获得最大命中率列表并从中获取最重复项目的索引。

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)

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

答案 5 :(得分:0)

此代码似乎有效:

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

答案 6 :(得分:0)

我会使用item的hashmap来反击。

每当您看到“关键”继承时,请递增其计数器值。如果你点击一个新元素,将计数器设置为1并继续。在此线性搜索结束时,您应该拥有每个数字的最大连续计数。