我正在使用collections.Counter对象。我希望逐个获得最常见的元素,但most_common
方法给出了完整的元素列表
有没有办法将此列表作为生成器?
答案 0 :(得分: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
注意:虽然将None
传递给collection.Counter.most_common()
似乎与传递任何内容(一种常见的Python习语)相同,但当前文档不实际上说那个,所以我决定谨慎行事并使用.. if .. else ..
条件表达式仅在n
不是None
时才传递n
,但其文档字符串明确说明“If { {1}}为None
,然后列出所有元素计数“。
如果这种轻微的差异不会让您担心,上述内容可以简化为:
def most_common(iterable, n=None):
return iter(Counter(iterable).most_common(n))
这是如此之短,您可能只想在iter()
调用Counter.most_common()
周围编写代码来避免调用额外包装函数的开销。
无论如何,输出应如下所示:
('i', 4)
('s', 4)
('p', 2)