Современное и быстрое решение для Python 3.7. Может также работать в некоторых интерпретаторах Python 3.6.
TLDR
Чтобы отсортировать словарь по клавишам:
sorted_dict = {k: disordered[k] for k in sorted(disordered)}
почти в три раза быстрее, чем принято отвечать; вероятно, больше, когда вы включаете импорт.
Комментарий от принятого ответа
Пример в принятом ответе не использует параметр key
для sorted()
, который (как должное, выглядит красиво и требует меньше печатать) происходит медленнее, поскольку оба элемента сгенерированных кортежей (key, value)
являются в сравнении. Поскольку словари Python не могут иметь два элемента с одним и тем же ключом, использование второго элемента кортежа для сравнения не требуется.
Как сортировать по ключу в Python 3.7
Большие изменения в Python 3.7, что the dictionaries are now ordered by default.
- Вы можете сгенерировать отсортированный 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)}
# use key = lambda - the slowest
key = lambda item: item[0]
sorted_dict = {k: v for k in sorted(disordered.items(), key=key)}
Вообще
Timing Результаты:
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)}")
Что вы подразумеваете под «не может сделать словарь из этого отсортированного списка»? По определению словарь не сортируется. Если вы хотите отсортированный словарь, посмотрите на [упорядоченные словари] (http://docs.python.org/release/3.1.5/whatsnew/3.1.html#pep-372-ordered-dictionaries). – inspectorG4dget
+1, потому что я помню, что у меня была такая же проблема (некоторое время назад, когда OrderedDict даже официально был в коллекциях!), И я помню разочарование ... – jsh