3

collections.Counterオブジェクトを使用しています。最も一般的な要素を 1 つずつ取得したいのですが、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

注: に渡すNoneことcollection.Counter.most_common()は何も渡さないことと同じように見えますが (一般的な Python のイディオム)、現在のドキュメントでは実際にはそうは言っていませ。そうでない場合はそれ.. if .. else ..を渡しますが、そのdocstringは明示的に「の場合は、すべての要素数をリストします」と言っています。nNonenNone

このわずかな不一致が気にならない場合は、上記を次のように短縮できます。

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 に答える