Разница между dictionary и ordereddict в python

Я пытаюсь получить сортированный словарь. Но порядок пунктов между mydict и orddict Кажется, не меняется.

from collections import OrderedDict

mydict = {'a':1,'b':2,'c':3,'d':4}

orddict = OrderedDict(mydict)

print(mydict,orddict)

# print items in mydict:
print('mydict')
for k,v in mydict.items():
    print(k,v)

print('ordereddict')
# print items in ordered dictionary
for k,v in orddict.items():
    print(k,v)


# print the dictionary keys
# for key in mydict.keys():
#     print(key)


#  print the dictionary values
# for value in mydict.values():
#     print(value)

3 ответов


An OrderedDict сохраняет вставленные элементы порядка:

>>> od = OrderedDict()
>>> od['c'] = 1
>>> od['b'] = 2
>>> od['a'] = 3
>>> od.items()
[('c', 1), ('b', 2), ('a', 3)]
>>> d = {}
>>> d['c'] = 1
>>> d['b'] = 2
>>> d['a'] = 3
>>> d.items()
[('a', 3), ('c', 1), ('b', 2)]

так OrderedDict не ордер элементы для вас, это хранит приказ, который вы ему даете.

если вы хотите "сортировать" словарь, вы, вероятно, хотите

>>> sorted(d.items())
[('a', 1), ('b', 2), ('c', 3)]

упорядоченные словари похожи на обычные словари, но они помнят порядок вставки элементов. При итерации по упорядоченному словарю элементы возвращаются в том порядке, в котором их ключи были впервые добавлены.

таким образом, он сортирует только по порядку добавления в dict

вы можете построить заказ OrderedDict ключом следующим образом,

orddict = OrderedDict(sorted(mydict.items(), key = lambda t: t[0]))

или просто как @ShadowRanger упоминалось в комментарий

orddict = OrderedDict(sorted(d.items()))

если вы хотите заказать по стоимости,

orddict = OrderedDict(sorted(mydict.items(), key = lambda t: t[1]))

дополнительная информация в 8.3.5.1. OrderedDict примеры и рецепты


добавление к ответу Брайана,OrderedDict Это действительно здорово. Вот почему:

  • вы можете использовать его как простой dict объект, потому что он поддерживает тестирование равенства с другими Mapping объекты типа сборники.счетчик.

  • OrderedDict сохраняет порядок вставки, как объяснил Брайан. В дополнение к этому у него есть метод popitem который возвращает пары (ключ, значение) в порядке LIFO. Таким образом, вы также можете использовать его как сопоставленный "стек".

вы не только получите полные возможности dict но также, некоторые интересные трюки.