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

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

Комментарии к вопросу (8)
Решение

Стандартные словари Python являются неупорядоченными. Даже если бы вы отсортировали пары (ключ-значение), вы не смогли бы хранить их в 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
Комментарии (14)

Сами словари не содержат упорядоченных элементов как таковых, но если вы хотите вывести их и т.д. в определенном порядке, то вот несколько примеров:

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

Комментарии (1)

Из [библиотечной документации коллекций Python](http://docs.python.org/2/library/collections.html?highlight = orderdict # orderdict-examples-and-recipes):

>>> 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)])
Комментарии (2)

Для 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}
Комментарии (0)

Существует несколько модулей Python, которые предоставляют реализации словаря, которые автоматически поддерживают ключи в отсортированном порядке. Рассмотрим модуль sortadcontainers, который представляет собой реализации pure-Python и fast-as-C. Существует также сравнение производительности с другими популярными опционами, сопоставленными друг с другом.

Использование упорядоченного диктата является неадекватным решением, если вам необходимо постоянно добавлять и удалять пары ключ / значение, а также итерацию.

>>> 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])
Комментарии (0)

Просто:

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
Комментарии (1)

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

Комментарии (0)

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

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

upd:

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

В 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
Комментарии (0)

Словарь Python был неупорядоченным до Python 3.6. В реализации CPython Python 3.6 словарь сохраняет порядок вставки. Из Python 3.7 это станет языковой функцией.

В журнале изменений Python 3.6 (https://docs.python.org/3.6/whatsnew/3.6.html#whatsnew36-compactdict):

Рассматривается аспект сохранения порядка в этой новой реализации детали реализации и не должны полагаться (это может изменить в будущем, но желательно иметь этот новый диктат реализация на языке для нескольких выпусков, прежде чем менять языковая спецификация для сохранения порядка семантики для всех текущих и будущие реализации Python; это также помогает сохранить обратная совместимость со старыми версиями языка, где порядок случайной итерации все еще действует, например,. Питон 3.5).

В документе Python 3.7 (https://docs.python.org/3.7/tutorial/datastructures.html#dictionaries):

Исполняющий список (d) в словаре возвращает список всех используемых ключей в словаре, в порядке вставки (если вы хотите, чтобы это было отсортировано, просто используйте отсортировано (d) вместо этого).

Таким образом, в отличие от предыдущих версий, вы можете отсортировать дикт после Python 3.6 / 3.7. Если вы хотите отсортировать вложенный dict, включая под-дикт внутри, вы можете сделать:

test_dict = {'a': 1, 'c': 3, 'b': {'b2': 2, 'b1': 1}}

def dict_reorder(item):
    return {k: sort_dict(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

Комментарии (0)

Здесь я нашел самое простое решение для сортировки диктовки питона по ключу с помощью 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}
Комментарии (0)

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

По вашему вопросу

Решение:

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

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

Комментарии (0)

Будет генерировать именно то, что вы хотите:

 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]))
Комментарии (1)

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

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

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.

Комментарии (0)

Я думаю, что проще всего отсортировать дикт по ключу и сохранить отсортированную пару ключ: значение в новом дикте.

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
Комментарии (0)

Дикты 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())]
Комментарии (1)

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

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

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

Комментарии (0)

Эта функция будет сортировать любой словарь рекурсивно по своему ключу. То есть, если какое-либо значение в словаре также является словарем, оно также будет отсортировано по его ключу. Если вы работаете на 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)
Комментарии (0)

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

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

Выход:

{'A':2,'B':1,'C':3}
Комментарии (2)

Самое простое решение состоит в том, что вы должны получить список ключей 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
Комментарии (0)