Каким будет хороший способ перейти с {2:3, 1:89, 4:5, 3:0}
на {1:89, 2:3, 3:0, 4:5}
?
Я проверил несколько сообщений, но все они используют оператор «сортировки», который возвращает кортежи.
Как отсортировать словарь по ключу?
Ответы (32)
Стандартные словари Python неупорядочены (до Python 3.7). Даже если вы отсортируете пары (ключ, значение), вы не сможете сохранить их в dict
таким образом, чтобы сохранить порядок.
Самый простой способ - использовать OrderedDict
, который запоминает порядок, в котором были вставлены элементы:
In [1]: import collections
In [2]: d = {2:3, 1:89, 4:5, 3:0}
In [3]: od = collections.OrderedDict(sorted(d.items()))
In [4]: od
Out[4]: OrderedDict([(1, 89), (2, 3), (3, 0), (4, 5)])
Неважно, как распечатывается od
; он будет работать как положено:
In [11]: od[1]
Out[11]: 89
In [12]: od[3]
Out[12]: 0
In [13]: for k, v in od.iteritems(): print k, v
....:
1 89
2 3
3 0
4 5
Python 3
Для пользователей Python 3 необходимо использовать .items()
вместо .iteritems()
:
In [13]: for k, v in od.items(): print(k, v)
....:
1 89
2 3
3 0
4 5
Спасибо, я использую python 2.6.5, а OrderedDict - для 2.7 и выше, поэтому он не работает.
Я использовал это, и он работает, я предполагаю, что в нем больше кода и избыточности, но работа выполняется, # unordered dict d = {2: 3, 1:89, 4: 5, 3: 0} orderDict = {} для ключа в отсортированном (d.iterkeys ()): ordersDict [ключ] = d [ключ]
@achrysochoou: тогда вы должны использовать рецепт OrderedDict, связанный в документации python, он очень хорошо работает для старого python
@achrysochoou: если это сработало, то это должно быть чистой случайностью. Как вам сказали, обычные словари не имеют понятия сортировки, независимо от того, назначаете ли вы ключи отсортированными или случайным образом.
Спасибо всем за вашу помощь, я прочту предложенную документацию и постараюсь следовать правильной методике. Ваше здоровье!
@achrysochoou не пишите «orderDict = {}» (как указано в вашем комментарии) - таким образом вы создаете простой dict, вместо этого вы должны написать «od = OrderedDict ()»
@Lucretiel: С практической точки зрения, вы правы. Возможно, этот ответ дает какое-то решение поставленного вопроса, если это понимать буквально, но если понимать буквально, кажется, что этот вопрос основан на неправильном понимании семантики словарей.
Почему бы просто не использовать sorted (d.items ()) и покончить с этим? Почему вы должны использовать OrderedDict ()?
Этот код мне помог сегодня. Ваш вопрос из 2016 года, но я думал, что все равно отвечу на него: обычные словари `sorted ()` не могут быть сохранены (по крайней мере, не по порядку). В следующий раз, когда вы захотите вывести их, вам придется снова их отсортировать. Используя упорядоченный словарь для хранения результатов, результаты теперь находятся в словаре в отсортированном порядке. Я построил словарь, в котором времена были ключами, отсортированными в обратном порядке, и теперь всякий раз, когда я выводю упорядоченный словарь, содержимое всегда меняется от самого нового к самому старому. Это не сработало, пока я не сохранил его в упорядоченном словаре.
Он не работает с ключом Alphanumarec, таким как key1
key2
key3
key4` key5
key6
key7
key8
<264771902652190> <264771902652190>
Обратите внимание, что в предстоящем выпуске Python 3.7, скорее всего, будет формализовано то, что изначально было изменением реализации в 3.6: dicts будут перебирать свои ключи или элементы в порядке вставки, но 3.6 не дает никаких гарантий. 3.7 будет.
Для python 3.7+: sorted_dict = dict(sorted(unsorted_dict.items()))
python 3.7+ не нуждается в orderDict, так как теперь он заказывается по умолчанию :-)
Из руководства python 3.7.4: «Выполнение list (d) в словаре возвращает список всех ключей, используемых в словаре, в порядке вставки». Таким образом, порядок вставки сохраняется, и на него можно положиться.
OrderedDict - это полурешение, поскольку оно поддерживает порядок вставки. Следовательно, нельзя начинать с пустого словаря и добавлять элементы, ожидая, что ключи будут в отсортированном порядке. Скорее, его можно использовать только в существующем словаре после заполнения всех элементов, поскольку структура OrderedDict работает только в порядке вставки, а не какой-либо сортировки, которую вы могли бы ожидать.
Вот производительность предлагаемых решений:
from collections import OrderedDict
from sortedcontainers import SortedDict
import json
keys = np.random.rand(100000)
vals = np.random.rand(100000)
d = dict(zip(keys, vals))
timeit SortedDict(d)
#45.8 ms ± 780 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
timeit sorted(d.items())
#91.9 ms ± 707 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
timeit OrderedDict(sorted(d.items(), key=lambda x: x[0]))
#93.7 ms ± 1.52 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
timeit dict(sorted(dic.items()))
#113 ms ± 824 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
timeit OrderedDict(sorted(dic.items()))
#122 ms ± 2.65 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
timeit json.dumps(d, sort_keys=True)
#259 ms ± 9.42 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Как мы видим, решение Гранта Дженкса на сегодняшний день является самым быстрым.
Если вы знаете, что все ваши ключи имеют один и тот же тип или имеют типы, которые поддерживают '<' (меньше, чем __lt__
python), тогда вы можете использовать dict(sorted(your_dict.items(), key=lambda _: _[0]))
простой для понимания однострочный код
Я нашел простой способ сортировки словаря - это создать новый, основанный на отсортированных элементах «ключ: значение» того, который вы пытаетесь отсортировать.
Если вы хотите отсортировать dict = {}
, получить все его элементы с помощью связанного метода, отсортировать их с помощью функции sorted()
, а затем создать новый словарь.
Вот код, использующий понимание словаря:
sorted_dict = {k:v for k,v in sorted(dict.items())}
Здесь уже есть множество ответов, демонстрирующих популярные способы сортировки словаря Python. Я подумал, что добавлю еще несколько менее очевидных способов для тех, кто приходит сюда из Google и ищет нестандартные идеи.
Пример словаря: d = {2: 'c', 1: 'b', 0: 'a', 3: 'd'}
Понимание словаря
# Converts to list, sorts, re-converts to dict
{k: v for k, v in sorted(list(d))}
Использование лямбда-выражений
Сортировка не всегда предназначена для упорядочивания строго по возрастанию или убыванию. Для более условной сортировки используйте вышеуказанный метод в сочетании с lamdas:
{k: v for k, v in sorted(d.items(), key=lambda v: ord(v[1]))}
Дополнительные примеры
В этой ветке уже достаточно хороших примеров. Еще несколько примеров, а также крайних случаев и странностей можно найти в этой статье о сортировке словарей в Python.
Для понимания списка словарей это не работает для меня, мне нужно заменить sorted(list(d))
на sorted(d.items())
(на python 3.8)
Что касается формулировки вопроса, большинство ответов здесь дают правильный ответ.
Однако, учитывая, как вещи должны быть на самом деле, с учетом десятилетий и десятилетий компьютерных наук, я совершенно удивляюсь, что на самом деле здесь есть только один ответ (от пользователя GrantJ), предполагающий использование сортированных ассоциативных контейнеров (sortedcontainers), которые сортируют элементы на основе ключа в точке их вставки.
Это позволит избежать массивного воздействия на производительность на каждый вызов sort(...)
(как минимум O(N*log(N))
, где N
- это количество элементов (логически это применимо ко всем таким решениям, которые здесь предлагают чтобы использовать sort(...)
). Учтите, что для всех таких решений, sort(...)
нужно будет вызывать каждый раз, когда необходимо получить доступ к коллекции как отсортированной ПОСЛЕ она была изменена путем добавления / удаления элементы ...
Мое предложение таково, поскольку оно позволяет вам сортировать словарный запас или сохранять его отсортированным по мере добавления элементов и, возможно, потребуется добавить элементы в будущем:
Постройте dict
с нуля по мере продвижения. Имейте вторую структуру данных, список, со списком ключей. Пакет bisect имеет функцию insort, которая позволяет вставлять в отсортированный список или сортировать ваш список после полного заполнения вашего dict. Теперь, когда вы перебираете свой dict, вы вместо этого перебираете список для доступа к каждому ключу по порядку, не беспокоясь о представлении структуры dict (которая не была создана для сортировки).
Простой способ сделать это:
d = {2:3, 1:89, 4:5, 3:0}
s = {k : d[k] for k in sorted(d)}
s
Out[1]: {1: 89, 2: 3, 3: 0, 4: 5}
Работает только для python 3.7+, где dict - это OrderedDict.
@kwarnke Pedantic, но dict - это не то же самое, что OrderedDict в Python 3.7+, хотя dict - это , конечно, заказанный в 3.7+
Эта функция будет рекурсивно сортировать любой словарь по его ключу. То есть, если какое-либо значение в словаре также является словарем, оно также будет отсортировано по его ключу. Если вы работаете на CPython 3.6 или более поздней версии, можно просто изменить использование dict
, а не OrderedDict
.
from collections import OrderedDict
def sort_dict(d):
items = [[k, v] for k, v in sorted(d.items(), key=lambda x: x[0])]
for item in items:
if isinstance(item[1], dict):
item[1] = sort_dict(item[1])
return OrderedDict(items)
#return dict(items)
Я придумал однострочную сортировку по диктовке.
>> a = {2:3, 1:89, 4:5, 3:0}
>> c = {i:a[i] for i in sorted(a.keys())}
>> print(c)
{1: 89, 2: 3, 3: 0, 4: 5}
[Finished in 0.4s]
Надеюсь, это будет полезно.
Или используйте pandas
,
Демо:
>>> d={'B':1,'A':2,'C':3}
>>> df=pd.DataFrame(d,index=[0]).sort_index(axis=1)
A B C
0 2 1 3
>>> df.to_dict('int')[0]
{'A': 2, 'B': 1, 'C': 3}
>>>
См .:
Вы можете создать новый словарь, отсортировав текущий словарь по ключу в соответствии с вашим вопросом.
Это ваш словарь
d = {2:3, 1:89, 4:5, 3:0}
Создайте новый словарь d1, отсортировав этот d с помощью лямбда-функции
d1 = dict(sorted(d.items(), key = lambda x:x[0]))
d1 должен быть {1: 89, 2: 3, 3: 0, 4: 5}, отсортированный по ключам в d.
Вам даже не нужно указывать ключ сортировки. d1 = dict(sorted(d.items()))
будет работать нормально
Почему это не лучший ответ?
Словарь 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; это также помогает сохранить обратная совместимость со старыми версиями языка, где случайный порядок итераций все еще действует, например Python 3.5).
В документе Python 3.7 (https://docs.python.org/3.7/tutorial/datastructures.html#icingaries):
Выполнение list (d) в словаре возвращает список всех используемых ключей в словаре в порядке вставки (если вы хотите отсортировать, просто используйте sorted (d) вместо).
Таким образом, в отличие от предыдущих версий, вы можете отсортировать dict после Python 3.6 / 3.7. Если вы хотите отсортировать вложенный dict, включая вложенный внутри, вы можете сделать:
test_dict = {'a': 1, 'c': 3, 'b': {'b2': 2, 'b1': 1}}
def dict_reorder(item):
return {k: dict_reoder(v) if isinstance(v, dict) else v for k, v in sorted(item.items())}
reordered_dict = dict_reorder(test_dict)
https://gist.github.com/ligyxy/f60f0374defc383aa098d44cfbd318eb
Мне это нравится, но у вас есть sort_dict()
в вашем понимании словаря, которое, вероятно, должно быть dict_reoder()
Для 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}
Другой способ записать то же самое - использовать понимание: {key:d[key] for key in sorted(d.keys())}
Отличный лайнер! Я не знал об этой новой функции. У меня это работает в Centos 7 на Python 3.6.8.
Это отличный ответ. Но не пытайтесь сделать его короче, заключив sorted
в {}
, как в {sorted(d.items())}
. Вот просто попробую создать набор.
Ответ @flow2k (используя "понимание") можно упростить: {key:d[key] for key in sorted(d)}
, поскольку sorted(d)
возвращает отсортированный список ключей d
dictionary = {1:[2],2:[],5:[4,5],4:[5],3:[1]}
temp=sorted(dictionary)
sorted_dict = dict([(k,dictionary[k]) for i,k in enumerate(temp)])
sorted_dict:
{1: [2], 2: [], 3: [1], 4: [5], 5: [4, 5]}
Я думаю, что проще всего отсортировать dict по ключу и сохранить отсортированную пару ключ: значение в новом dict.
dict1 = {'renault': 3, 'ford':4, 'volvo': 1, 'toyota': 2}
dict2 = {} # create an empty dict to store the sorted values
for key in sorted(dict1.keys()):
if not key in dict2: # Depending on the goal, this line may not be neccessary
dict2[key] = dict1[key]
Чтобы было понятнее:
dict1 = {'renault': 3, 'ford':4, 'volvo': 1, 'toyota': 2}
dict2 = {} # create an empty dict to store the sorted values
for key in sorted(dict1.keys()):
if not key in dict2: # Depending on the goal, this line may not be neccessary
value = dict1[key]
dict2[key] = value
Сгенерирует именно то, что вы хотите:
D1 = {2:3, 1:89, 4:5, 3:0}
sort_dic = {}
for i in sorted(D1):
sort_dic.update({i:D1[i]})
print sort_dic
{1: 89, 2: 3, 3: 0, 4: 5}
Но это неправильный способ сделать это, потому что он может демонстрировать отличное поведение с разными словарями, о чем я недавно узнал. Следовательно, идеальный способ был предложен Тимом в ответе на мой запрос, которым я делюсь здесь.
from collections import OrderedDict
sorted_dict = OrderedDict(sorted(D1.items(), key=lambda t: t[0]))
Что значит «показывать отличное поведение с разными словарями»? С каким «отличным поведением» сортировка не может справиться?
Самое простое решение состоит в том, что вы должны получить список ключей dict в порядке сортировки, а затем перебрать dict. Например,
a1 = {'a':1, 'b':13, 'd':4, 'c':2, 'e':30}
a1_sorted_keys = sorted(a1, key=a1.get, reverse=True)
for r in a1_sorted_keys:
print r, a1[r]
Ниже будет вывод (в порядке убывания)
e 30
b 13
d 4
c 2
a 1
Есть простой способ отсортировать словарь.
Согласно вашему вопросу,
Решение:
c={2:3, 1:89, 4:5, 3:0}
y=sorted(c.items())
print y
(где c - имя вашего словаря.)
Эта программа дает следующий вывод:
[(1, 89), (2, 3), (3, 0), (4, 5)]
как ты хотел.
Другой пример:
d={"John":36,"Lucy":24,"Albert":32,"Peter":18,"Bill":41}
x=sorted(d.keys())
print x
Дает результат: ['Albert', 'Bill', 'John', 'Lucy', 'Peter']
y=sorted(d.values())
print y
Дает результат: [18, 24, 32, 36, 41]
z=sorted(d.items())
print z
Дает результат:
[('Albert', 32), ('Bill', 41), ('John', 36), ('Lucy', 24), ('Peter', 18)]
Следовательно, изменив его на ключи, значения и элементы, вы можете печатать так, как хотели. Надеюсь, это поможет!
from operator import itemgetter
# if you would like to play with multiple dictionaries then here you go:
# Three dictionaries that are composed of first name and last name.
user = [
{'fname': 'Mo', 'lname': 'Mahjoub'},
{'fname': 'Abdo', 'lname': 'Al-hebashi'},
{'fname': 'Ali', 'lname': 'Muhammad'}
]
# This loop will sort by the first and the last names.
# notice that in a dictionary order doesn't matter. So it could put the first name first or the last name first.
for k in sorted (user, key=itemgetter ('fname', 'lname')):
print (k)
# This one will sort by the first name only.
for x in sorted (user, key=itemgetter ('fname')):
print (x)
l = dict.keys()
l2 = l
l2.append(0)
l3 = []
for repeater in range(0, len(l)):
smallnum = float("inf")
for listitem in l2:
if listitem < smallnum:
smallnum = listitem
l2.remove(smallnum)
l3.append(smallnum)
l3.remove(0)
l = l3
for listitem in l:
print(listitem)
Есть еще 14 ответов. Не могли бы вы немного объяснить свой код и почему он может быть лучше других решений?
Проголосовано против - Довольно нечитаемый код с короткими бессмысленными именами переменных l, l2, l3. Кажется, это попытка косвенного и неэффективного алгоритма без знания стандартных функций Python, и в любом случае не работает при тестировании на небольшом примере в исходном сообщении.
Сравнение времени двух методов в 2.7 показывает, что они практически идентичны:
>>> setup_string = "a = sorted(dict({2:3, 1:89, 4:5, 3:0}).items())"
>>> timeit.timeit(stmt="[(k, val) for k, val in a]", setup=setup_string, number=10000)
0.003599141953657181
>>> setup_string = "from collections import OrderedDict\n"
>>> setup_string += "a = OrderedDict({1:89, 2:3, 3:0, 4:5})\n"
>>> setup_string += "b = a.items()"
>>> timeit.timeit(stmt="[(k, val) for k, val in b]", setup=setup_string, number=10000)
0.003581275490432745
Ребята, вы усложняете ... это действительно просто
from pprint import pprint
Dict={'B':1,'A':2,'C':3}
pprint(Dict)
Вывод:
{'A':2,'B':1,'C':3}
Проголосовал за, потому что я не знал, что pprint сортирует словари для их отображения, но OP действительно спросил о «переходе» от несортированного к отсортированному dict, т.е. OP, похоже, хочет что-то, что остается отсортированным в памяти, возможно, для некоторого алгоритма, который требует отсортированных ключей
Этот метод не позволяет назначать цепочку, поскольку pprint не возвращает ничего. >>> adict = {'B': 1, 'A': 2, 'C': 3} >>> ppdict = pprint (adict) {'A': 2, 'B': 1, 'C': 3} >>> ppdict.type () Traceback (последний вызов последним): файл "<stdin>", строка 1, в <module> AttributeError: объект 'NoneType' не имеет атрибута 'type'
Просто:
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
sd
- это список кортежей, а не словарь. (все еще полезно.)
Я считаю, что вашему оператору печати требуется (). печать (k, v)
Вам нужен только () для python 3. print k, v
отлично работает в python 2, потому что print
- это ключевое слово, а не функция в python 2.
Существует ряд модулей Python, которые предоставляют реализации словаря, которые автоматически поддерживают ключи в отсортированном порядке. Рассмотрим модуль sortedcontainers, который является реализациями на чистом Python и fast-as-C. Также существует сравнение производительности с другими популярными опциями, сравниваемыми друг с другом.
Использование упорядоченного dict - неадекватное решение, если вам нужно постоянно добавлять и удалять пары ключ / значение, одновременно выполняя итерацию.
>>> from sortedcontainers import SortedDict
>>> d = {2:3, 1:89, 4:5, 3:0}
>>> s = SortedDict(d)
>>> s.items()
[(1, 89), (2, 3), (3, 0), (4, 5)]
Тип SortedDict также поддерживает поиск и удаление индексированного местоположения, что невозможно со встроенным типом dict.
>>> s.iloc[-1]
4
>>> del s.iloc[2]
>>> s.keys()
SortedSet([1, 2, 4])
Словари Python неупорядочены. Обычно это не проблема, поскольку наиболее распространенный вариант использования - поиск.
Самый простой способ сделать то, что вы хотите, - создать collections.OrderedDict
, вставив элементы в отсортированном порядке.
ordered_dict = collections.OrderedDict([(k, d[k]) for k in sorted(d.keys())])
Если вам нужно выполнить итерацию, как предлагали другие выше, самым простым способом было бы перебрать отсортированные ключи. Примеры-
Распечатать значения, отсортированные по ключам:
# create the dict
d = {k1:v1, k2:v2,...}
# iterate by keys in sorted order
for k in sorted(d.keys()):
value = d[k]
# do something with k, value like print
print k, value
Получить список значений, отсортированных по ключам:
values = [d[k] for k in sorted(d.keys())]
for k,value in sorted(d.items()):
лучше: избегает доступа к словарю по ключу снова в цикле
Нашел другой способ:
import json
print json.dumps(d, sort_keys = True)
UPD:
1. это также сортирует вложенные объекты (спасибо @DanielF).
2. Словари python неупорядочены, поэтому их можно сшить для печати или присвоения только str.
Но при этом также сортируются ключи вложенных объектов, которые могут не понадобиться.
Обратите внимание, что это только сортирует словари, а не списки, например dict.keys () не будет отсортирован, потому что это список.
Здесь я нашел простейшее решение для сортировки словаря Python по ключу с использованием pprint
.
например.
>>> x = {'a': 10, 'cd': 20, 'b': 30, 'az': 99}
>>> print x
{'a': 10, 'b': 30, 'az': 99, 'cd': 20}
, но при использовании pprint он вернет отсортированный dict
>>> import pprint
>>> pprint.pprint(x)
{'a': 10, 'az': 99, 'b': 30, 'cd': 20}
В Python 3.
>>> D1 = {2:3, 1:89, 4:5, 3:0}
>>> for key in sorted(D1):
print (key, D1[key])
дает
1 89
2 3
3 0
4 5
Из документации библиотеки Python collections
:
>>> from collections import OrderedDict
>>> # regular unsorted dictionary
>>> d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}
>>> # dictionary sorted by key -- OrderedDict(sorted(d.items()) also works
>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
>>> # dictionary sorted by value
>>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])
>>> # dictionary sorted by length of the key string
>>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))
OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])
классно! Ребята, если вы хотите изменить порядок (по возрастанию ДО по убыванию), вы просто добавляете reverse=True
например. OrderedDict(sorted(d.items(), reverse=True, key=lambda t: t[0]))
В PyCharm, независимо от того, какой словарь я использую, я всегда получаю это предупреждение: Unexpected type(s): (List[str]) Possible types: (Mapping) (Iterable[Tuple[Any, Any]])
В самих словарях нет заказанных элементов как таковых, если вы захотите распечатать их и т. Д. В определенном порядке, вот несколько примеров:
В 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/
Вы также можете использовать OrderedDict в python 2.4+, как в ответе NPE
и если вы используете items (), вы можете сделать это как for key, value in sorted(mydict.items())"
Сами словари не имеют упорядоченных элементов как таковых -> больше не соответствует действительности!
Как так получилось, ты можешь объяснить?
@James См. ссылку.
Как уже упоминалось, словари по своей природе неупорядочены. Однако, если проблема заключается просто в отображении словарей в упорядоченном виде, вы можете переопределить метод __str__
в подклассе словарей и использовать этот класс словаря, а не встроенный dict
. Например,
class SortedDisplayDict(dict):
def __str__(self):
return "{" + ", ".join("%r: %r" % (key, self[key]) for key in sorted(self)) + "}"
>>> d = SortedDisplayDict({2:3, 1:89, 4:5, 3:0})
>>> d
{1: 89, 2: 3, 3: 0, 4: 5}
Обратите внимание: это ничего не меняет в том, как хранятся ключи, в том порядке, в котором они будут возвращаться, когда вы перебираете их и т. Д., Только в том, как они отображаются с помощью print
или в консоли python.
@KarlKnechtel - мой вариант использования заключается в том, что у меня есть приложение CLI с примитивным меню, а параметры меню находятся в словаре в качестве ключей. Я хотел бы отображать клавиши в алфавитном порядке для удобства пользователя.
возможный дубликат словаря на Python с порядком, который я установил при запуске
@ Ринзлер: Согласен. Кроме того, хотя оба вопроса вызывают путаницу, спрашивая о порядке словаря, а не о порядке доступа к его содержимому, я думаю, что тот, на который вы ссылаетесь, с меньшей вероятностью вызовет путаницу, поскольку ясно, чего на самом деле хочет спрашивающий, и у этого есть допустимые варианты использования.
@RyanHaining "словари не отсортированы" - не всегда верно. Например, Java имеет
TreeMap
, который ведет себя точно так, как хочет OP.@Nayuki, учитывая, что это вопрос Python, я приравнивал словарь к
dict
Обратите внимание, что словари теперь упорядочены по порядку вставки (python 3.6+). Некоторые ответы ниже указывают на это.
При использовании словаря для построения гистограммы построение этой гистограммы является хорошим поводом для сортировки словаря по ключам.
@matiasg обратите внимание, что в Python 3.6, сохраняющие порядок вставки dicts являются деталью реализации CPython. Именно с Python 3.7 сохранение порядка вставки dicts стало официально частью языка.