Как отсортировать словарь по ключу в цифровом порядке Python
Вот словарь выглядит так:
{'57481': 50, '57480': 89, '57483': 110, '57482': 18, '57485': 82, '57484': 40}
Я хотел бы отсортировать словарь в числовом порядке, результат должен быть:
{'57480': 89, '57481': 50, '57482': 18, '57483': 110, '57484': 40, '57485': 82}
Я пробовал sorted(self.docs_info.items)
, но он не работает.
Ответы
Ответ 1
Если вам нужно только сортировать по ключу, вы уже на 95%. Предполагая, что ваш словарь называется docs_info
:
for key, value in sorted(docs_info.items()): # Note the () after items!
print(key, value)
Поскольку словарные ключи всегда уникальны, вызов sorted
on docs_info.items()
(который является последовательностью кортежей) эквивалентен сортировке только клавишами.
Имейте в виду, что строки, содержащие числа, сортируются неинтуитивно! например "11"
"меньше", чем "2"
. Если вам нужны их отсортированные численно, я рекомендую сделать ключи int
вместо str
; например.
int_docs_info = {int(k) : v for k, v in docss_info.items()}
Это, конечно, просто изменяет порядок, в котором вы доступ к элементам словаря, что обычно является достаточным (поскольку, если вы не обращаетесь к нему, какое это имеет значение, если он отсортирован?). Если по какой-то причине вам нужно, чтобы сам dict был "отсортирован", вам придется использовать collections.OrderedDict
, который запоминает порядок, в который элементы были вставлены в него. Поэтому сначала вы можете отсортировать словарь (как указано выше), а затем создать OrderedDict
из отсортированных (ключ, значение) пар:
sorted_docs_info = collections.OrderedDict(sorted(docs_info.items()))
Ответ 2
Стандартные питоны Python являются "неупорядоченными". Вы можете использовать OrderedDict
, посмотрите docs:
from collections import OrderedDict
d = {'57481': 50, '57480': 89, '57483': 110, '57482': 18, '57485': 82, '57484': 40}
OrderedDict(sorted(d.items(), key=lambda t: t[0]))
# OrderedDict([('57480', 89), ('57481', 50), ('57482', 18), ('57483', 110), ('57484', 40), ('57485', 82)])
Ответ 3
Если повторная сортировка элементов и их вставка в упорядоченном dict происходит слишком медленно, рассмотрите одну из отсортированных реализаций dict в PyPI. A SortedDict тип данных эффективно поддерживает свои ключи в отсортированном порядке. Модуль sortedcontainers содержит одну такую реализацию.
Установка из PyPI проста:
pip install sortedcontainers
Если вы не можете pip install
, просто скопируйте файлы sortedlist.py и sorteddict.py из репозитория с открытым исходным кодом. SortedContainers реализована в чистом Python, но реализована как быстрая реализация.
После простой установки:
In [1]: from sortedcontainers import SortedDict
In [6]: SortedDict({'57481': 50, '57480': 89, '57483': 110, '57482': 18, '57485': 82, '57484': 40})
Out[6]: SortedDict({'57480': 89, '57481': 50, '57482': 18, '57483': 110, '57484': 40, '57485': 82})
Модуль отсортированных контейнеров также поддерживает сравнение производительности нескольких популярных реализаций.