1. ホーム
  2. python

[解決済み] カウンターを値で並べ替えるには?- パイソン

2022-02-02 19:52:45

質問

反転したリスト内包を行う以外に、カウンターを値でソートするpythonicな方法はありますか?もしそうなら、それはこれよりも高速です。

>>> 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)

解決方法は?

を使用します。 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 が使われます。

>>> 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ソートHowto をご覧ください。