Что бы хороший способ , чтобы перейти от {2:3, 1:89, 4:5, 3:0}
к {1:89, 2:3, 3:0, 4:5}
?
Я проверил некоторые сообщения, но все они используют оператор «сортировка», который возвращает кортежи.
python
sorting
dictionary
Antony
источник
источник
Ответы:
Стандартные словари Python неупорядочены. Даже если вы отсортируете пары (ключ, значение), вы не сможете сохранить их таким
dict
образом, чтобы сохранить порядок.Самый простой способ - использовать
OrderedDict
, который запоминает порядок, в котором были вставлены элементы:Не берите в голову способ
od
, которым распечатан; это будет работать как ожидалось:Python 3
Для пользователей Python 3 необходимо использовать
.items()
вместо.iteritems()
:источник
sorted_dict = dict(sorted(unsorted_dict.items()))
Сами словари не имеют заказанных элементов как таковых, если вы хотите распечатать их и т. Д. В некотором порядке, вот несколько примеров:
В Python 2.4 и выше:
дает:
(Python ниже 2.4 :)
Источник: http://www.saltycrane.com/blog/2007/09/how-to-sort-python-dictionary-by-keys/
источник
for key, value in sorted(mydict.items())"
Из документации библиотеки Python
collections
:источник
reverse=True
например,OrderedDict(sorted(d.items(), reverse=True, key=lambda t: t[0]))
Unexpected type(s): (List[str]) Possible types: (Mapping) (Iterable[Tuple[Any, Any]])
Для CPython / PyPy 3.6 и любого Python 3.7 или выше это легко сделать с помощью:
источник
{key:d[key] for key in sorted(d.keys())}
Существует ряд модулей Python, которые предоставляют реализации словаря, которые автоматически поддерживают ключи в отсортированном порядке. Рассмотрим модуль sortedcontainers, представляющий собой реализации на чистом Python и fast-as-C. Существует также сравнение производительности с другими популярными опциями, сравниваемыми друг с другом.
Использование упорядоченного dict является неадекватным решением, если вам нужно постоянно добавлять и удалять пары ключ / значение во время итерации.
Тип SortedDict также поддерживает индексированный поиск и удаление местоположения, что невозможно при использовании встроенного типа dict.
источник
Просто:
Вывод:
источник
sd
это список кортежей, а не словарь. (все еще полезно.)Как уже упоминали другие, словари по своей природе неупорядочены. Однако, если проблема заключается в простом отображении словарей в упорядоченном виде, вы можете переопределить
__str__
метод в подклассе словаря и использовать этот класс словаря, а не встроенныйdict
. Например.Обратите внимание, что это ничего не меняет в том, как хранятся ключи, в каком порядке они будут возвращаться, когда вы перебираете их и т. Д., А также в том, как они отображаются
print
на консоли Python или на консоли.источник
Нашел другой способ:
upd:
1. это также сортирует вложенные объекты (спасибо @DanielF).
2. Словари python неупорядочены, поэтому это подходит для печати или присваивания только str.
источник
В Python 3.
дает
источник
Словарь Python был неупорядочен до Python 3.6. В реализации Python 3.6 для CPython словарь сохраняет порядок вставки. Начиная с Python 3.7, это станет функцией языка.
В журнале изменений Python 3.6 ( https://docs.python.org/3.6/whatsnew/3.6.html#whatsnew36-compactdict ):
В документе Python 3.7 ( https://docs.python.org/3.7/tutorial/datastructures.html#dictionaries ):
Таким образом, в отличие от предыдущих версий, вы можете сортировать слова после Python 3.6 / 3.7. Если вы хотите отсортировать вложенный dict, включающий в себя sub-dict внутри, вы можете сделать:
https://gist.github.com/ligyxy/f60f0374defc383aa098d44cfbd318eb
источник
Здесь я нашел простейшее решение для сортировки python dict по ключу
pprint
. например.но при использовании pprint он вернет отсортированный dict
источник
Существует простой способ сортировки словаря.
По вашему вопросу
Решение:
(Где c, это название вашего словаря.)
Эта программа дает следующий вывод:
как ты и хотел.
Другой пример:
Дает вывод:
['Albert', 'Bill', 'John', 'Lucy', 'Peter']
Дает вывод:
[18, 24, 32, 36, 41]
Дает вывод:
Следовательно, изменяя его на ключи, значения и элементы, вы можете печатать так, как хотели. Надеюсь, это поможет!
источник
Будет генерировать именно то, что вы хотите:
Но это не правильный способ сделать это, потому что он может показывать отличное поведение с разными словарями, которые я недавно изучил. Поэтому Тим предложил идеальный способ в ответ на мой запрос, которым я поделюсь здесь.
источник
Я думаю, что самое простое - отсортировать данные по ключу и сохранить отсортированную пару ключ: значение в новом файле.
Чтобы было понятнее:
источник
Вы можете создать новый словарь, отсортировав текущий словарь по ключу в соответствии с вашим вопросом.
Это твой словарь
Создайте новый словарь d1, отсортировав его с помощью лямбда-функции
d1 должно быть {1: 89, 2: 3, 3: 0, 4: 5}, отсортировано по ключам в d.
источник
Диктофоны Python не упорядочены. Обычно это не проблема, так как наиболее распространенный вариант использования - поиск.
Самый простой способ сделать то, что вы хотите, это создать
collections.OrderedDict
вставку элементов в отсортированном порядке.Если вам нужно выполнить итерацию, как предлагали другие, самый простой способ - выполнить итерацию по отсортированным ключам. Примеры-
Вывести значения, отсортированные по ключам:
Получить список значений, отсортированных по ключам:
источник
for k,value in sorted(d.items()):
лучше: избегает доступа к диктовке по ключу снова в циклеЯ придумываю однострочную сортировку.
Надеюсь, это будет полезно.
источник
Эта функция будет рекурсивно сортировать любой словарь по его ключу. То есть, если какое-либо значение в словаре также является словарем, оно также будет отсортировано по его ключу. Если вы работаете на CPython 3.6 или выше, можно сделать простое изменение,
dict
а не использоватьOrderedDict
.источник
Ребята, вы все усложняете ... это действительно просто
Выход:
источник
Самое простое решение заключается в том, что вы должны получить список ключей dict в порядке их сортировки, а затем выполнить итерацию по dict. Например
Ниже будет вывод (в порядке убывания)
источник
Простой способ сделать это:
источник
Сравнение времени двух методов в 2.7 показывает, что они практически идентичны:
источник
источник
источник
Или используйте
pandas
,Демо-версия:
Видеть:
источник
Мое предложение заключается в следующем: он позволяет вам сортировать или сохранять сортировку, когда вы добавляете элементы, и, возможно, в будущем вам потребуется добавить элементы:
Построить
dict
с нуля, как вы идете вместе. Есть вторая структура данных, список, с вашим списком ключей. В пакете bisect есть функция insort, которая позволяет вставлять в отсортированный список или сортировать ваш список после полного заполнения вашего dict. Теперь, когда вы перебираете свой dict, вы вместо этого перебираете список, чтобы обращаться к каждому ключу по порядку, не беспокоясь о представлении структуры dict (которая не была создана для сортировки).источник
Что касается того, как сформулирован вопрос, большинство ответов здесь отвечают на него правильно.
Тем не менее, учитывая то, как все должно быть сделано на самом деле, принимая во внимание десятилетия и десятилетия компьютерных наук, я пришел к моему полному удивлению, что на самом деле здесь есть только один ответ (от пользователя GrantJ ), предполагающий использование отсортированных ассоциативных контейнеров (sortedcontainers), которые сортирует элементы по ключу в точке их вставки.
Это позволит избежать значительного влияния на производительность для каждого вызова
sort(...)
(как минимумO(N*log(N))
, гдеN
есть количество элементов (логически, это относится ко всем таким решениям, которые предлагают использоватьsort(...)
). Примите во внимание, что для всех таких решенийsort(...)
потребуется вызываться каждый раз, когда необходимо получить доступ к коллекции как отсортированный ПОСЛЕ того, как она была изменена путем добавления / удаления элементов ...источник
источник