我正在尝试返回列表中最常见的元素(统计模式)。不幸的是我不知道如何使用all
和iterable。如果我不使用all():
def large(a):
for i in set(a):
for j in set(a):
if a.count(i)<a.count(j):
break
return i
但是我知道这可以更有说服力地写出来。也有人可以写出更有说服力的版本吗? 我认为这有点像:
[i for i,j in set(a) if all(a.count(i)>a.count(j)]
此代码有2个问题。首先,set(a)
需要第二个值来解包,第二个是all
在这里不起作用。
请帮帮我。谢谢!
示例:在{'a','a','b','b','b','c'}
中,您希望'b
'成为最大的元素
答案 0 :(得分:2)
好的 - 立即了解您的问题。下面的代码不是一般应该如何解决这个问题。但是学习all()的工作原理是可以的。请注意,它的效率远远低于Counter。有趣的是,它将返回最常见的每个元素 - 因此在需要精确处理多模态数据时可能会有用。
>>> q = list("aaabbbbcc")
>>> q
['a', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'c']
>>> r = set(q)
>>> r
set(['a', 'c', 'b'])
>>> [x for x in r if all([q.count(x) >= q.count(y) for y in r])]
['b']
答案 1 :(得分:1)
from collections import Counter
def most_common(a):
return Counter(a).most_common(1)[0][0]
如果您绝对必须使用all
执行此操作 - 我认为这不是最佳方法 - 请尝试
def most_common(a):
a_count = [(i, a.count(i)) for i in set(a)]
for i,c in a_count:
if all(c >= cc for ii,cc in a_count):
return i