3

我正在使用collections.Counter对象。我想一一获取最常见的元素,但该most_common方法为我提供了整个元素列表。
有什么办法可以将此列表作为生成器?

4

1 回答 1

1

您可以像这样简单地包装collection.Counter.most_common()一个生成器函数:

from collections import Counter

def most_common(iterable, n=None):
    return iter(Counter(iterable).most_common() if n is None else
                Counter(iterable).most_common(n))

for item in most_common('Mississippi', 3):
    print item

注意:虽然看起来传递Nonecollection.Counter.most_common()它与不传递任何东西相同(一个常见的 Python 习惯用法),但当前文档实际上并没有这么说,所以我决定谨慎起见并使用.. if .. else ..条件表达式只n当它不是时传递它None,但是它的文档字符串确实明确地说“如果nNone,则列出所有元素计数”。

如果您不担心这种细微的差异,则可以将上述内容缩短为:

def most_common(iterable, n=None):
    return iter(Counter(iterable).most_common(n))

这太短了,您可能只想iter()围绕任何Counter.most_common()调用进行编码,以避免调用额外包装函数的开销。

无论如何,输出应如下所示:

('i', 4)
('s', 4)
('p', 2)
于 2012-07-22T15:56:49.400 回答