Подтвердить что ты не робот

Как отсортировать словарь по ключу в цифровом порядке 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), но он не работает.

4b9b3361

Ответ 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})

Модуль отсортированных контейнеров также поддерживает сравнение производительности нескольких популярных реализаций.