преобразовать цикл for в понимание словаря

У меня есть небольшая программа, которая отлично работает. Я пытаюсь заставить себя пересматривать\анализировать свой код, чтобы попытаться сделать свой код (и себя) немного лучше.

Мне было интересно, если эта небольшая часть кода:

temp2 = {}
for key in sorted(temp1.keys()):
    temp2[key] = temp1[key]

не может быть переписано как понимание словаря.

В первую очередь из-за моего глубокого отсутствия опыта я не могу «конвертировать» это в понимание.

Все, что делает цикл, это берет словарь temp1, сортирует его и помещает только что отсортированные пары key:value в temp2.

Как я уже говорил выше, все работает как есть, но я пытаюсь научиться находить закономерности, в которых я могу внести улучшения.


person MarkS    schedule 14.06.2017    source источник


Ответы (1)


Непосредственно перевести это в понимание словаря легко:

temp2 = {key: value for key, value in sorted(temp1.items())}

В случае, если вы не хотите использовать value в качестве разрешения конфликтов, если ключи равны, вы также можете указать key, чтобы вы сортировали только на основе key:

temp2 = {key: value for key, value in sorted(temp1.items(), key=lambda x: x[0])}

Несмотря на то, что словари «упорядочены» в python-3.6, это не означает, что вы должны полагаться на них (упорядоченность официально является просто побочным эффектом!). Лучше использовать OrderedDict и быть в безопасности:

from collections import OrderedDict
temp2 = OrderedDict([(key, value) for key, value in sorted(temp1.items(), key=lambda x: x[0])])
person MSeifert    schedule 14.06.2017
comment
Поскольку ваш второй ответ сработал отлично, мне было интересно, что дает третий вариант (с участием OrderedDict). Когда вариант № 3 будет более подходящим выбором? Спасибо. - person MarkS; 14.06.2017
comment
@MarkS Ах, это немного сложно. Сами словари неупорядочены, поэтому сортировка словаря по определению обречена на неудачу. Но начиная с 3.6 словари теперь упорядочены, но официально это просто деталь реализации, которая может измениться в любой момент. Поэтому, если вы хотите, чтобы он работал с разными версиями Python или хотите перестраховаться, вам обязательно нужно использовать расширение OrderedDict. Я в основном добавил его, потому что по-прежнему лучше предпочесть OrderedDict dict, если вам нужно заказать его. :) - person MSeifert; 14.06.2017