Разница между 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
но также, некоторые интересные трюки.