値でカウンターを並べ替える方法は?-python


144

逆リスト内包表記のリスト内包表記を行う以外に、カウンタを値でソートするためのPythonの方法はありますか?もしそうなら、それはこれより速いです:

>>> from collections import Counter
>>> x = Counter({'a':5, 'b':3, 'c':7})
>>> sorted(x)
['a', 'b', 'c']
>>> sorted(x.items())
[('a', 5), ('b', 3), ('c', 7)]
>>> [(l,k) for k,l in sorted([(j,i) for i,j in x.items()])]
[('b', 3), ('a', 5), ('c', 7)]
>>> [(l,k) for k,l in sorted([(j,i) for i,j in x.items()], reverse=True)]
[('c', 7), ('a', 5), ('b', 3)

回答:


250

Counter.most_common()メソッドを使用すると、アイテムが並べ替えられます

>>> from collections import Counter
>>> x = Counter({'a':5, 'b':3, 'c':7})
>>> x.most_common()
[('c', 7), ('a', 5), ('b', 3)]

これは、可能な限り最も効率的な方法で行われます。すべての値の代わりに上位Nを要求した場合heapq、ストレートソートではなくa が使用されます。

>>> x.most_common(1)
[('c', 7)]

カウンター以外では、ソートは常にkey関数に基づいて調整できます。.sort()そして、sorted()の両方を使用すると、入力シーケンスをソートする値を指定することができますその呼び出し可能取ります。sorted(x, key=x.get, reverse=True)と同じ並べ替えが得られますx.most_common()が、キーだけが返されます。次に例を示します。

>>> sorted(x, key=x.get, reverse=True)
['c', 'a', 'b']

または、指定された(key, value)ペアの値のみでソートできます。

>>> sorted(x.items(), key=lambda pair: pair[1], reverse=True)
[('c', 7), ('a', 5), ('b', 3)]

詳細については、Pythonの並べ替えの方法を参照してください。


30

@MartijnPietersの回答に対するかなり良い追加は、タプルしか返さないため、出現順にソートされた辞書を取得することCollections.most_commonです。私はよくこれを便利なログファイルのjson出力と組み合わせます:

from collections import Counter, OrderedDict

x = Counter({'a':5, 'b':3, 'c':7})
y = OrderedDict(x.most_common())

出力で:

OrderedDict([('c', 7), ('a', 5), ('b', 3)])
{
  "c": 7, 
  "a": 5, 
  "b": 3
}

10

はい:

>>> from collections import Counter
>>> x = Counter({'a':5, 'b':3, 'c':7})

ソートされたキーワードキーとラムダ関数の使用:

>>> sorted(x.items(), key=lambda i: i[1])
[('b', 3), ('a', 5), ('c', 7)]
>>> sorted(x.items(), key=lambda i: i[1], reverse=True)
[('c', 7), ('a', 5), ('b', 3)]

これはすべての辞書で機能します。ただしCounter、ソート済みのアイテムを提供する特別な機能があります(最も頻度の高いものから最も頻度の低いものまで)。それはmost_common()

>>> x.most_common()
[('c', 7), ('a', 5), ('b', 3)]
>>> list(reversed(x.most_common()))  # in order of least to most
[('b', 3), ('a', 5), ('c', 7)]

表示するアイテムの数を指定することもできます。

>>> x.most_common(2)  # specify number you want
[('c', 7), ('a', 5)]

逆の並べ替えを行う別の方法は、キー関数を次のように設定することですlamda i: -i[1]
Steinar Lima

4

keyキーワードがソート方法を定義する、より一般的なソート。数値タイプの前のマイナスは降順を示します。

>>> x = Counter({'a':5, 'b':3, 'c':7})
>>> sorted(x.items(), key=lambda k: -k[1])  # Ascending
[('c', 7), ('a', 5), ('b', 3)]

2
keyキーワードは、ソート方法を定義して、マイナスの数値タイプ前降順示す
アレックスシーム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.