web-dev-qa-db-ja.com

collections.Counter()インスタンスを降順に反復するPythonの方法は?

Python 2(より正確には2.7))では、collections.Counterインスタンスをカウントの降順で繰り返します。

>>> import collections
>>> c = collections.Counter()
>>> c['a'] = 1
>>> c['b'] = 999
>>> c
Counter({'b': 999, 'a': 1})
>>> for x in c:
        print x
a
b

上記の例では、要素はCounterインスタンスに追加された順序で繰り返されているように見えます。

リストを最高から最低まで繰り返したいと思います。 Counterの文字列表現がこれを行うことがわかり、推奨される方法があるかどうか疑問に思っています。

27
Inactivist

c.most_common()を反復処理して、目的の順序でアイテムを取得できます。 Counter.most_common()のドキュメント も参照してください。

例:

>>> c = collections.Counter(a=1, b=999)
>>> c.most_common()
[('b', 999), ('a', 1)]
35
Sven Marnach

Pythonコレクションでカウンターを反復する例は次のとおりです。

>>>def counterIterator(): 
 import collections
 counter = collections.Counter()
 counter.update(('u1','u1'))
 counter.update(('u2','u2'))
 counter.update(('u2','u1'))
 for ele in counter:
  print(ele,counter[ele])
>>>counterIterator()
u1 3
u2 3
4
Chandra

降順を返すだけで問題は解決しましたが、一般的な方法は次のとおりです。 Googleから他の誰かがここに来た場合、ここでそれを解決しなければなりませんでした。基本的に、上記のものはcollections.Counter()内の辞書のキーを返します。値を取得するには、次のようにキーを辞書に渡すだけです。

for x in c:
    key = x
    value = c[key]

Wordのカウントがあり、低頻度のカウントを除外したいというより具体的な問題がありました。ここでのコツは、collections.Counter()のコピーを作成することです。そうしないと、コレクションからそれらを削除しようとすると、「RuntimeError:dictionary changed size during iteration」が発生します。

for Word in words.copy():
    # remove small instance words
    if words[Word] <= 3:
        del words[Word]
3
dreyco676