Как отсортировать словарь по ключу?

avatar
Antony
25 января 2012 в 10:54
1615117
32
1181

Каким будет хороший способ перейти с {2:3, 1:89, 4:5, 3:0} на {1:89, 2:3, 3:0, 4:5}?
Я проверил несколько сообщений, но все они используют оператор «сортировки», который возвращает кортежи.

Источник
Randy
3 июня 2014 в 19:53
6

@KarlKnechtel - мой вариант использования заключается в том, что у меня есть приложение CLI с примитивным меню, а параметры меню находятся в словаре в качестве ключей. Я хотел бы отображать клавиши в алфавитном порядке для удобства пользователя.

nbro
10 января 2015 в 02:05
1

возможный дубликат словаря на Python с порядком, который я установил при запуске

sdenham
1 апреля 2015 в 16:18
1

@ Ринзлер: Согласен. Кроме того, хотя оба вопроса вызывают путаницу, спрашивая о порядке словаря, а не о порядке доступа к его содержимому, я думаю, что тот, на который вы ссылаетесь, с меньшей вероятностью вызовет путаницу, поскольку ясно, чего на самом деле хочет спрашивающий, и у этого есть допустимые варианты использования.

Nayuki
19 января 2017 в 04:36
1

@RyanHaining "словари не отсортированы" - не всегда верно. Например, Java имеет TreeMap, который ведет себя точно так, как хочет OP.

Ryan Haining
19 января 2017 в 07:42
2

@Nayuki, учитывая, что это вопрос Python, я приравнивал словарь к dict

matiasg
30 июня 2019 в 21:20
12

Обратите внимание, что словари теперь упорядочены по порядку вставки (python 3.6+). Некоторые ответы ниже указывают на это.

Tejas Kale
10 июня 2020 в 13:47
0

При использовании словаря для построения гистограммы построение этой гистограммы является хорошим поводом для сортировки словаря по ключам.

robertspierre
25 сентября 2020 в 14:33
3

@matiasg обратите внимание, что в Python 3.6, сохраняющие порядок вставки dicts являются деталью реализации CPython. Именно с Python 3.7 сохранение порядка вставки dicts стало официально частью языка.

Ответы (32)

avatar
NPE
25 января 2012 в 10:56
1120

Стандартные словари 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
Antony
25 января 2012 в 11:10
1

Спасибо, я использую python 2.6.5, а OrderedDict - для 2.7 и выше, поэтому он не работает.

Antony
25 января 2012 в 11:20
1

Я использовал это, и он работает, я предполагаю, что в нем больше кода и избыточности, но работа выполняется, # unordered dict d = {2: 3, 1:89, 4: 5, 3: 0} orderDict = {} для ключа в отсортированном (d.iterkeys ()): ordersDict [ключ] = d [ключ]

Cédric Julien
25 января 2012 в 11:20
1

@achrysochoou: тогда вы должны использовать рецепт OrderedDict, связанный в документации python, он очень хорошо работает для старого python

Ricardo Cárdenes
25 января 2012 в 11:25
5

@achrysochoou: если это сработало, то это должно быть чистой случайностью. Как вам сказали, обычные словари не имеют понятия сортировки, независимо от того, назначаете ли вы ключи отсортированными или случайным образом.

Antony
25 января 2012 в 11:32
1

Спасибо всем за вашу помощь, я прочту предложенную документацию и постараюсь следовать правильной методике. Ваше здоровье!

Bob
11 сентября 2014 в 16:43
0

@achrysochoou не пишите «orderDict = {}» (как указано в вашем комментарии) - таким образом вы создаете простой dict, вместо этого вы должны написать «od = OrderedDict ()»

sdenham
1 апреля 2015 в 15:53
0

@Lucretiel: С практической точки зрения, вы правы. Возможно, этот ответ дает какое-то решение поставленного вопроса, если это понимать буквально, но если понимать буквально, кажется, что этот вопрос основан на неправильном понимании семантики словарей.

thestephenstanton
18 сентября 2016 в 22:07
0

Почему бы просто не использовать sorted (d.items ()) и покончить с этим? Почему вы должны использовать OrderedDict ()?

TMWP
24 марта 2017 в 21:47
0

Этот код мне помог сегодня. Ваш вопрос из 2016 года, но я думал, что все равно отвечу на него: обычные словари `sorted ()` не могут быть сохранены (по крайней мере, не по порядку). В следующий раз, когда вы захотите вывести их, вам придется снова их отсортировать. Используя упорядоченный словарь для хранения результатов, результаты теперь находятся в словаре в отсортированном порядке. Я построил словарь, в котором времена были ключами, отсортированными в обратном порядке, и теперь всякий раз, когда я выводю упорядоченный словарь, содержимое всегда меняется от самого нового к самому старому. Это не сработало, пока я не сохранил его в упорядоченном словаре.

Hardik Gajjar
2 января 2018 в 10:04
0

Он не работает с ключом Alphanumarec, таким как key1 key2 key3 key4` key5 key6 key7 key8 <264771902652190> <264771902652190>

holdenweb
2 марта 2018 в 21:23
1

Обратите внимание, что в предстоящем выпуске Python 3.7, скорее всего, будет формализовано то, что изначально было изменением реализации в 3.6: dicts будут перебирать свои ключи или элементы в порядке вставки, но 3.6 не дает никаких гарантий. 3.7 будет.

aksh1618
15 июля 2018 в 14:52
122

Для python 3.7+: sorted_dict = dict(sorted(unsorted_dict.items()))

Aneuway
25 января 2019 в 18:09
29

python 3.7+ не нуждается в orderDict, так как теперь он заказывается по умолчанию :-)

Mostafa Hadian
16 июля 2019 в 17:40
8

Из руководства python 3.7.4: «Выполнение list (d) в словаре возвращает список всех ключей, используемых в словаре, в порядке вставки». Таким образом, порядок вставки сохраняется, и на него можно положиться.

demongolem
30 апреля 2020 в 15:46
0

OrderedDict - это полурешение, поскольку оно поддерживает порядок вставки. Следовательно, нельзя начинать с пустого словаря и добавлять элементы, ожидая, что ключи будут в отсортированном порядке. Скорее, его можно использовать только в существующем словаре после заполнения всех элементов, поскольку структура OrderedDict работает только в порядке вставки, а не какой-либо сортировки, которую вы могли бы ожидать.

avatar
Mehdi Abbassi
23 сентября 2021 в 09:32
1

Вот производительность предлагаемых решений:

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)

Как мы видим, решение Гранта Дженкса на сегодняшний день является самым быстрым.

avatar
dshri
19 сентября 2021 в 07:12
0

Если вы знаете, что все ваши ключи имеют один и тот же тип или имеют типы, которые поддерживают '<' (меньше, чем __lt__ python), тогда вы можете использовать dict(sorted(your_dict.items(), key=lambda _: _[0])) простой для понимания однострочный код

avatar
m3.b
24 июня 2021 в 18:49
5

Я нашел простой способ сортировки словаря - это создать новый, основанный на отсортированных элементах «ключ: значение» того, который вы пытаетесь отсортировать. Если вы хотите отсортировать dict = {}, получить все его элементы с помощью связанного метода, отсортировать их с помощью функции sorted(), а затем создать новый словарь.

Вот код, использующий понимание словаря:

sorted_dict = {k:v for k,v in sorted(dict.items())}
avatar
alphazwest
23 июня 2021 в 18:41
1

Здесь уже есть множество ответов, демонстрирующих популярные способы сортировки словаря 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.

lhoupert
27 сентября 2021 в 18:23
0

Для понимания списка словарей это не работает для меня, мне нужно заменить sorted(list(d)) на sorted(d.items()) (на python 3.8)

avatar
PeterB
7 июня 2020 в 19:58
2

Что касается формулировки вопроса, большинство ответов здесь дают правильный ответ.

Однако, учитывая, как вещи должны быть на самом деле, с учетом десятилетий и десятилетий компьютерных наук, я совершенно удивляюсь, что на самом деле здесь есть только один ответ (от пользователя GrantJ), предполагающий использование сортированных ассоциативных контейнеров (sortedcontainers), которые сортируют элементы на основе ключа в точке их вставки.

Это позволит избежать массивного воздействия на производительность на каждый вызов sort(...) (как минимум O(N*log(N)), где N - это количество элементов (логически это применимо ко всем таким решениям, которые здесь предлагают чтобы использовать sort(...)). Учтите, что для всех таких решений, sort(...) нужно будет вызывать каждый раз, когда необходимо получить доступ к коллекции как отсортированной ПОСЛЕ она была изменена путем добавления / удаления элементы ...

avatar
demongolem
30 апреля 2020 в 15:55
0

Мое предложение таково, поскольку оно позволяет вам сортировать словарный запас или сохранять его отсортированным по мере добавления элементов и, возможно, потребуется добавить элементы в будущем:

Постройте dict с нуля по мере продвижения. Имейте вторую структуру данных, список, со списком ключей. Пакет bisect имеет функцию insort, которая позволяет вставлять в отсортированный список или сортировать ваш список после полного заполнения вашего dict. Теперь, когда вы перебираете свой dict, вы вместо этого перебираете список для доступа к каждому ключу по порядку, не беспокоясь о представлении структуры dict (которая не была создана для сортировки).

avatar
pr94
7 марта 2020 в 15:53
17

Простой способ сделать это:

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} 
kwarnke
7 декабря 2020 в 11:04
0

Работает только для python 3.7+, где dict - это OrderedDict.

Bede Constantinides
6 августа 2021 в 11:41
1

@kwarnke Pedantic, но dict - это не то же самое, что OrderedDict в Python 3.7+, хотя dict - это , конечно, заказанный в 3.7+

avatar
Booboo
4 сентября 2019 в 12:45
5

Эта функция будет рекурсивно сортировать любой словарь по его ключу. То есть, если какое-либо значение в словаре также является словарем, оно также будет отсортировано по его ключу. Если вы работаете на 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)
avatar
Jeevan Chaitanya
13 декабря 2018 в 05:31
5

Я придумал однострочную сортировку по диктовке.

>> 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]

Надеюсь, это будет полезно.

avatar
U12-Forward
17 октября 2018 в 06:42
1

Или используйте 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}
>>> 

См .:

Документы этого

Документация по всем пандам

avatar
Amit Prafulla
16 июня 2018 в 09:14
13

Вы можете создать новый словарь, отсортировав текущий словарь по ключу в соответствии с вашим вопросом.

Это ваш словарь

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.

M.Vanderlee
3 марта 2021 в 16:52
3

Вам даже не нужно указывать ключ сортировки. d1 = dict(sorted(d.items())) будет работать нормально

John S
7 марта 2021 в 22:58
0

Почему это не лучший ответ?

avatar
Guangyang Li
8 января 2018 в 17:34
23

Словарь 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

drs
18 апреля 2021 в 13:34
0

Мне это нравится, но у вас есть sort_dict() в вашем понимании словаря, которое, вероятно, должно быть dict_reoder()

avatar
Dipu
30 октября 2017 в 14:33
280

Для 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}
flow2k
27 ноября 2019 в 22:57
11

Другой способ записать то же самое - использовать понимание: {key:d[key] for key in sorted(d.keys())}

Tomas Stribula
2 июня 2021 в 13:19
1

Отличный лайнер! Я не знал об этой новой функции. У меня это работает в Centos 7 на Python 3.6.8.

ChaimG
1 сентября 2021 в 14:04
1

Это отличный ответ. Но не пытайтесь сделать его короче, заключив sorted в {}, как в {sorted(d.items())}. Вот просто попробую создать набор.

Julian - BrainAnnex.org
9 октября 2021 в 09:07
0

Ответ @flow2k (используя "понимание") можно упростить: {key:d[key] for key in sorted(d)}, поскольку sorted(d) возвращает отсортированный список ключей d

avatar
Mahdi Ghelichi
11 октября 2017 в 20:19
2
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]}
avatar
lallolu
14 марта 2017 в 14:45
6

Я думаю, что проще всего отсортировать 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
avatar
jax
2 марта 2017 в 11:20
9

Сгенерирует именно то, что вы хотите:

 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]))
ingyhere
10 ноября 2019 в 20:26
0

Что значит «показывать отличное поведение с разными словарями»? С каким «отличным поведением» сортировка не может справиться?

avatar
Hafiz Muhammad Shafiq
26 января 2017 в 04:17
3

Самое простое решение состоит в том, что вы должны получить список ключей 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
avatar
Sree
19 января 2017 в 04:29
12

Есть простой способ отсортировать словарь.

Согласно вашему вопросу,

Решение:

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)]

Следовательно, изменив его на ключи, значения и элементы, вы можете печатать так, как хотели. Надеюсь, это поможет!

avatar
Mohammad Mahjoub
25 ноября 2016 в 19:17
2
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)
avatar
user7070507
25 октября 2016 в 15:30
0
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)
FelixSFD
25 октября 2016 в 15:53
3

Есть еще 14 ответов. Не могли бы вы немного объяснить свой код и почему он может быть лучше других решений?

Captain Lepton
8 декабря 2016 в 16:17
1

Проголосовано против - Довольно нечитаемый код с короткими бессмысленными именами переменных l, l2, l3. Кажется, это попытка косвенного и неэффективного алгоритма без знания стандартных функций Python, и в любом случае не работает при тестировании на небольшом примере в исходном сообщении.

avatar
Jesuisme
26 сентября 2016 в 23:59
1

Сравнение времени двух методов в 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 
avatar
Derick Fdo
15 сентября 2016 в 05:27
2

Ребята, вы усложняете ... это действительно просто

from pprint import pprint
Dict={'B':1,'A':2,'C':3}
pprint(Dict)

Вывод:

{'A':2,'B':1,'C':3}
Captain Lepton
8 декабря 2016 в 16:13
0

Проголосовал за, потому что я не знал, что pprint сортирует словари для их отображения, но OP действительно спросил о «переходе» от несортированного к отсортированному dict, т.е. OP, похоже, хочет что-то, что остается отсортированным в памяти, возможно, для некоторого алгоритма, который требует отсортированных ключей

user4322543
8 декабря 2016 в 19:02
0

Этот метод не позволяет назначать цепочку, поскольку 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'

avatar
user3769249
12 ноября 2015 в 21:28
41

Просто:

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
nischi
24 ноября 2016 в 09:53
9

sd - это список кортежей, а не словарь. (все еще полезно.)

DenVog
14 августа 2020 в 19:56
0

Я считаю, что вашему оператору печати требуется (). печать (k, v)

Alan Bagel
30 июня 2021 в 15:20
0

Вам нужен только () для python 3. print k, v отлично работает в python 2, потому что print - это ключевое слово, а не функция в python 2.

avatar
GrantJ
28 марта 2014 в 16:27
49

Существует ряд модулей 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])
avatar
Ramashish Baranwal
28 марта 2014 в 04:18
5

Словари 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())]
Jean-François Fabre
27 апреля 2018 в 19:38
2

for k,value in sorted(d.items()): лучше: избегает доступа к словарю по ключу снова в цикле

avatar
tschesseket
12 марта 2014 в 21:43
24

Нашел другой способ:

import json
print json.dumps(d, sort_keys = True)

UPD:
1. это также сортирует вложенные объекты (спасибо @DanielF).
2. Словари python неупорядочены, поэтому их можно сшить для печати или присвоения только str.

Daniel F
17 июля 2015 в 21:08
0

Но при этом также сортируются ключи вложенных объектов, которые могут не понадобиться.

Andrew
18 августа 2017 в 20:08
0

Обратите внимание, что это только сортирует словари, а не списки, например dict.keys () не будет отсортирован, потому что это список.

avatar
Atul Arvind
3 февраля 2014 в 11:11
12

Здесь я нашел простейшее решение для сортировки словаря 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}
avatar
Evgeny Tryastsin
17 декабря 2013 в 02:22
19

В 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
avatar
Dennis
2 марта 2013 в 21:04
221

Из документации библиотеки 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)])
benscabbia
28 августа 2016 в 20:03
6

классно! Ребята, если вы хотите изменить порядок (по возрастанию ДО по убыванию), вы просто добавляете reverse=True например. OrderedDict(sorted(d.items(), reverse=True, key=lambda t: t[0]))

Euler_Salter
24 июля 2018 в 10:00
1

В PyCharm, независимо от того, какой словарь я использую, я всегда получаю это предупреждение: Unexpected type(s): (List[str]) Possible types: (Mapping) (Iterable[Tuple[Any, Any]])

avatar
James
21 декабря 2012 в 13:01
474

В самих словарях нет заказанных элементов как таковых, если вы захотите распечатать их и т. Д. В определенном порядке, вот несколько примеров:

В 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/

radtek
29 января 2015 в 22:09
2

Вы также можете использовать OrderedDict в python 2.4+, как в ответе NPE

beep_check
4 февраля 2020 в 02:07
1

и если вы используете items (), вы можете сделать это как for key, value in sorted(mydict.items())"

minexew
6 апреля 2020 в 06:46
1

Сами словари не имеют упорядоченных элементов как таковых -> больше не соответствует действительности!

James
6 апреля 2020 в 09:31
0

Как так получилось, ты можешь объяснить?

SearchSpace
28 июня 2021 в 17:10
0

@James См. ссылку.

avatar
Brian
25 января 2012 в 12:16
26

Как уже упоминалось, словари по своей природе неупорядочены. Однако, если проблема заключается просто в отображении словарей в упорядоченном виде, вы можете переопределить метод __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.