1

我正在尝试返回列表中最常见的元素(统计模式)。不幸的是,我不知道如何使用all可迭代的。如果我不使用 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' 是最大的元素

4

2 回答 2

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']
于 2012-06-24T20:10:39.447 回答
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
于 2012-06-24T20:11:24.357 回答