Как отсортировать словарь по ключу?
Как отсортировать словарь по его ключам?
Пример входных данных:
{2: 3, 1: 89, 4: 5, 3: 0}
Желаемый выход:
{1: 89, 2: 3, 3: 0, 4: 5}
Как я могу выполнить сортировку словаря в Python так, чтобы ключи были упорядочены по возрастанию?
5 ответ(ов)
Для CPython/PyPy 3.6 и любой версии Python 3.7 или выше, это можно легко сделать с помощью следующего кода:
>>> d = {2: 3, 1: 89, 4: 5, 3: 0}
>>> dict(sorted(d.items()))
{1: 89, 2: 3, 3: 0, 4: 5}
Этот пример демонстрирует, как отсортировать словарь по ключам, преобразовав пары ключ-значение в список и затем обратно в словарь.
Словари в Python действительно не имеют упорядоченных элементов, поэтому, если вам нужно вывести их в определенном порядке, вот несколько способов сделать это:
В Python 2.4 и выше:
mydict = {'carl': 40,
'alan': 2,
'bob': 1,
'danny': 3}
for key in sorted(mydict):
print "%s: %s" % (key, mydict[key])
Этот код выведет:
alan: 2
bob: 1
carl: 40
danny: 3
(В Python ниже 2.4:)
keylist = mydict.keys()
keylist.sort()
for key in keylist:
print "%s: %s" % (key, mydict[key])
Таким образом, вы можете сортировать словари по ключам и выводить их в нужном порядке. Источник: http://www.saltycrane.com/blog/2007/09/how-to-sort-python-dictionary-by-keys/
В вашем коде вы создаете словарь d
и сортируете его элементы, а затем выводите их на экран. Однако порядок сортировки по умолчанию основан на ключах словаря. Похоже, что вам нужно вывести пары ключ-значение в порядке ключей. Тем не менее, ваш вывод на самом деле не соответствует отсортированным ключам. Чтобы получить вывод, указанный вами, сортировка должна производиться по значениям. Вот исправленный код:
d = {2: 3, 1: 89, 4: 5, 3: 0}
sd = sorted(d.items(), key=lambda item: item[1]) # сортируем по значениям
for k, v in sd:
print(k, v) # используйте скобки для функции print в Python 3
Вывод будет следующим:
3 0
2 3
4 5
1 89
Если же вы хотите получить именно тот вывод, что указали (сначала ключ 1), вы можете отсортировать словарь по ключам, а для этого достаточно не указывать ключ сортировки:
d = {2: 3, 1: 89, 4: 5, 3: 0}
sd = sorted(d.items()) # сортировка по ключам
for k, v in sd:
print(k, v)
Однако стоит отметить, что указанный вами вывод (1 89
, 2 3
, 3 0
, 4 5
) будет доступен только в том случае, если пара (1, 89) будет первой в отсортированном списке. То есть, вам необходимо обеспечить, чтобы ключ 1 был первый в исходном словаре, если вы хотите, чтобы вывод соответствовал вашему примеру.
Действительно, до Python 3.6 словари были неупорядоченными. В реализации CPython Python 3.6 словарь сохраняет порядок вставки элементов. Начиная с Python 3.7, это становится особенностью языка.
В changelog Python 3.6 (https://docs.python.org/3.6/whatsnew/3.6.html#whatsnew36-compactdict) указано:
Сохранение порядка в новой реализации считается деталью реализации и не должно быть воспринимаемо как обязательное (это может измениться в будущем, однако предполагается, что новая реализация dict останется в языке на несколько версий, прежде чем изменится спецификация языка для обязательного соблюдения порядка для всех текущих и будущих реализаций Python; это также помогает сохранить обратную совместимость со старыми версиями языка, в которых по-прежнему сохраняется случайный порядок итерации, например, Python 3.5).
В документе Python 3.7 (https://docs.python.org/3.7/tutorial/datastructures.html#dictionaries) сообщается:
Выполнение list(d) на словаре возвращает список всех ключей, используемых в словаре, в порядке вставки (если вы хотите отсортированный список, просто используйте sorted(d) вместо этого).
Таким образом, в отличие от предыдущих версий, вы можете сортировать словари после Python 3.6/3.7. Если вам нужно отсортировать вложенный словарь, включая подсловарь, вы можете использовать такой код:
test_dict = {'a': 1, 'c': 3, 'b': {'b2': 2, 'b1': 1}}
def dict_reorder(item):
return {k: dict_reorder(v) if isinstance(v, dict) else v for k, v in sorted(item.items())}
reordered_dict = dict_reorder(test_dict)
Таким образом, вы получите отсортированный словарь, сохранив структуру вложенных словарей.
Нашел еще один способ:
import json
print(json.dumps(d, sort_keys=True))
Обновление:
Это также сортирует вложенные объекты (спасибо @DanielF).
Словари в Python неупорядоченные, поэтому это решение подходит только для вывода или присваивания строке.
Как отсортировать список словарей по значению словаря в Python?
Преобразование списка словарей в DataFrame pandas
Сортировка Map<Key, Value> по значениям
Получить ключ по значению в словаре
Как отсортировать список/кортеж списков/кортежей по элементу на заданном индексе