[英]How do you calculate the greatest number of repetitions in a list?
如果我在 Python 中有一个列表,例如
[1, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1]
如何计算任何元素的最大重复次数? 在这种情况下, 2
最多重复 4 次, 1
最多重复 3 次。
有没有办法做到这一点,而且还记录最长运行开始的索引?
使用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 过滤器。 每次 key 函数的值发生变化时,它都会生成一个 break 或 new group
# [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])
循环遍历列表,跟踪当前数字、重复次数,并将其与您看到该数字重复的最多次数进行比较。
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
这是我的解决方案:
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]
- 您可以制作列表的新副本,但具有唯一值和相应的命中列表。
- 然后获取点击列表的最大值,并从它的索引中获取您最重复的项目。
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)
但我不知道这是最快的方法还是有更快的解决方案。 如果您认为有更快或更有效的解决方案,请告知我们。
如果您只希望它用于任何元素(即重复次数最多的元素),您可以使用:
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
)并且仅记录具有最大数量的元素。
编辑:使 fa 的定义更短...
我编写此代码并轻松工作:
lst = [4,7,2,7,7,7,3,12,57]
maximum=0
for i in lst:
count = lst.count(i)
if count>maximum:
maximum=count
indexx = lst.index(i)
print(lst[indexx])
这段代码似乎工作:
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
我会使用项目的哈希图来反击。
每次看到“键”连续时,增加其计数器值。 如果你击中了一个新元素,请将计数器设置为 1 并继续前进。 在此线性搜索结束时,您应该获得每个数字的最大连续计数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.