Python3.7向けの最新の高速ソリューション。Python3.6の一部のインタープリターでも機能する可能性があります。
TLDR
キーで辞書を並べ替えるには、次を使用します。
sorted_dict = {k: disordered[k] for k in sorted(disordered)}
受け入れられた答えよりもほぼ3倍速い。インポートを含めると、おそらくもっと多くなります。
受け入れられた回答にコメントする
キーのみを反復処理する代わりに、受け入れられた回答の例(dict反復のkey
パラメーターまたはデフォルトの動作を使用)はタプルを反復処理します。これは、キーのみを比較してリスト内包内の辞書要素にアクセスするよりも驚くほど遅いことがわかります。 。sorted()
(key, value)
Python3.7でキーで並べ替える方法
Python 3.7での大きな変更は、辞書がデフォルトで順序付けられるようになったことです。
- dict内包表記を使用してソートされたdictを生成できます。
OrderedDict
互換性のために、使用する方が望ましい場合があります。
sorted(d.items())
なしで使用しないでくださいkey
。
見る:
disordered = {10: 'b', 3: 'a', 5: 'c'}
# sort keys, then get values from original - fast
sorted_dict = {k: disordered[k] for k in sorted(disordered)}
# key = itemgetter - slower
from operator import itemgetter
key = itemgetter(0)
sorted_dict = {k: v for k, v in sorted(disordered.items(), key=key)}
# key = lambda - the slowest
key = lambda item: item[0]
sorted_dict = {k: v for k in sorted(disordered.items(), key=key)}
タイミング結果:
Best for {k: d[k] for k in sorted(d)}: 7.507327548999456
Best for {k: v for k, v in sorted(d.items(), key=key_getter)}: 12.031082626002899
Best for {k: v for k, v in sorted(d.items(), key=key_lambda)}: 14.22885995300021
Best for dict(sorted(d.items(), key=key_getter)): 11.209122000000207
Best for dict(sorted(d.items(), key=key_lambda)): 13.289728325995384
Best for dict(sorted(d.items())): 14.231471302999125
Best for OrderedDict(sorted(d.items(), key=key_getter)): 16.609151654003654
Best for OrderedDict(sorted(d.items(), key=key_lambda)): 18.52622927199991
Best for OrderedDict(sorted(d.items())): 19.436101284998585
テストコード:
from timeit import repeat
setup_code = """
from operator import itemgetter
from collections import OrderedDict
import random
random.seed(0)
d = {i: chr(i) for i in [random.randint(0, 120) for repeat in range(120)]}
key_getter = itemgetter(0)
key_lambda = lambda item: item[0]
"""
cases = [
# fast
'{k: d[k] for k in sorted(d)}',
'{k: v for k, v in sorted(d.items(), key=key_getter)}',
'{k: v for k, v in sorted(d.items(), key=key_lambda)}',
# slower
'dict(sorted(d.items(), key=key_getter))',
'dict(sorted(d.items(), key=key_lambda))',
'dict(sorted(d.items()))',
# the slowest
'OrderedDict(sorted(d.items(), key=key_getter))',
'OrderedDict(sorted(d.items(), key=key_lambda))',
'OrderedDict(sorted(d.items()))',
]
for code in cases:
times = repeat(code, setup=setup_code, repeat=3)
print(f"Best for {code}: {min(times)}")