web-dev-qa-db-ja.com

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

逆リスト内包表記のリスト内包表記を行う以外に、値でCounterをソートする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)
99
alvas

Counter.most_common() method を使用すると、アイテムをソートしますfor you

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

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

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

カウンター以外では、key関数に基づいてソートをいつでも調整できます。 .sort()sorted()は両方とも、入力シーケンスをソートする値を指定できるcallableを取ります。 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 sorting howto をご覧ください。

181
Martijn Pieters

@ MartijnPieters へのかなりいい追加は、Collections.most_commonのみが返されるため、発生順にソートされたdictionaryを返すことです。タプル。私はしばしばこれを便利なログファイルの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
}
18
Hooked

はい:

>>> 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)]
9
Inbar Rose

keyキーワードが並べ替え方法を定義する、より一般的な並べ替え。数値型が降順を示す前のマイナス:

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