web-dev-qa-db-ja.com

Python 3値で辞書をソートします

私が見つけた唯一のメソッドは、python2で機能するか、タプルのリストのみを返します。

辞書を並べ替えることは可能ですか? {"aa": 3, "bb": 4, "cc": 2, "dd": 1}、その値で?

私が達成したいソートされた辞書の順序は、最大から最小の順です。結果は次のようになります。

bb 4
aa 3
cc 2
dd 1

そして、並べ替えた後、テキストファイルに保存します。

58
user2094432

itemgetter(他の回答を参照)は(私が知っているように)大規模な辞書ではより効率的ですが、一般的な場合では、d.getが勝ると信じています。また、追加のimportは必要ありません。

>>> d = {"aa": 3, "bb": 4, "cc": 2, "dd": 1}
>>> s = [(k, d[k]) for k in sorted(d, key=d.get, reverse=True)]
>>> for k, v in s:
...     k, v
...
('bb', 4)
('aa', 3)
('cc', 2)
('dd', 1)

または、d.__getitem__key関数として設定すると、d.getをわずかに上回るパフォーマンスを提供できることに注意してください。

91
SzieberthAdam
from collections import OrderedDict
from operator import itemgetter    

d = {"aa": 3, "bb": 4, "cc": 2, "dd": 1}
print(OrderedDict(sorted(d.items(), key = itemgetter(1), reverse = True)))

プリント

OrderedDict([('bb', 4), ('aa', 3), ('cc', 2), ('dd', 1)])

あなたの最後の文からですが、タプルのリストはうまくいくようです。

from operator import itemgetter  

d = {"aa": 3, "bb": 4, "cc": 2, "dd": 1}
for key, value in sorted(d.items(), key = itemgetter(1), reverse = True):
    print(key, value)

印刷する

bb 4
aa 3
cc 2
dd 1
27
Paul Draper

辞書をソートするには、operatorモジュールを使用できます。 ここ は、オペレータモジュールのドキュメントです。

import operator                             #Importing operator module
dc =  {"aa": 3, "bb": 4, "cc": 2, "dd": 1}  #Dictionary to be sorted

dc_sort = sorted(dc.items(),key = operator.itemgetter(1),reverse = True)
print dc_sort

出力シーケンスはソートされたリストになります:

[('bb', 4), ('aa', 3), ('cc', 2), ('dd', 1)]

キーに関してソートしたい場合は、

dc_sort = sorted(dc.items(),key = operator.itemgetter(0),reverse = True)

出力シーケンスは次のとおりです。

[('dd', 1), ('cc', 2), ('bb', 4), ('aa', 3)]
8
Reck

より単純な(および最大10%高速)方法は、ラムダ式を使用することです

d = {'aa': 3, 'bb': 4, 'cc': 2, 'dd': 1}
s = sorted(d.items(), key=lambda x: x[1], reverse=True)

for k, v in s:
    print(k, v)

タイミング

IOを画像から除外するために、_print(k, v)passに置き換えたCPython 3.7上の%%timeit.

D.get()を使用して受け入れられた回答:

1.19 µs ± 16.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

ラムダ式:

1.07 µs ± 10.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
4

valuesreverse順序(最大から最小)でソートできます 辞書の理解

{k: d[k] for k in sorted(d, key=d.get, reverse=True)}
# {'b': 4, 'a': 3, 'c': 2, 'd': 1}

昇順(最小から最大)でvaluesでソートする場合

{k: d[k] for k in sorted(d, key=d.get)}
# {'d': 1, 'c': 2, 'a': 3, 'b': 4}

keysで昇順に並べ替える場合

{k: d[k] for k in sorted(d)}
# {'a': 3, 'b': 4, 'c': 2, 'd': 1}

辞書は挿入順序を保持するため、これはCPython 3.6以降およびPython 3.7以降の実装で機能します。

2
Boris

辞書をソートし、後で辞書として機能させるには、標準ライブラリの OrderedDict を使用できます。

それが必要なものではない場合、タプルのリストを残すソート関数を再検討することをお勧めします。キーと値のペア(タプル)の順序付きリストではない場合、どの出力が必要でしたか?

0