我正在尝试获得排序的字典。但是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)
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
不会为您order元素,而是保留您赋予它的顺序。
如果您想对字典进行“排序”,则可能需要
>>> sorted(d.items())
[('a', 1), ('b', 2), ('c', 3)]
自Python 3.7起,新的改进是:
dict对象的插入顺序保留特性已被声明为Python语言规范的正式组成部分。
这意味着不再真正需要OrderedDict
。它们几乎相同。
但是Python 3.7+ dict
和OrderedDict
之间有区别,在这里证明:
from collections import OrderedDict
d = {'b': 1, 'a': 2}
od = OrderedDict([('b', 1), ('a', 2)])
# they are equal with content and order
assert d == od
assert list(d.items()) == list(od.items())
assert repr(dict(od)) == repr(d)
很明显,两个对象的字符串表示形式有所不同,dict
对象的形式更自然,更紧凑。
str(d) # {'b': 1, 'a': 2}
str(od) # OrderedDict([('b', 1), ('a', 2)])
关于两者之间的不同方法,可以用集合论来回答这个问题:
d_set = set(dir(d))
od_set = set(dir(od))
od_set.difference(d_set)
# {'__dict__', '__reversed__', 'move_to_end'}
这意味着OrderedDict
至少具有dict
没有内置的两个功能,但此处显示了解决方法:
# 1) OrderedDict can be reversed (but then what?)
reversed(od)
# <odict_iterator at 0x7fc03f119888>
reversed(d)
# TypeError: 'dict' object is not reversible
# better way to reverse a dict
dict(reversed(list(d.items()))) # {'a': 2, 'b': 1}
# 2) OrderedDict has 'move_to_end' method
od.move_to_end('b') # now it is: OrderedDict([('a', 2), ('b', 1)])
# dict does not, but similar can be done with
d['b'] = d.pop('b') # now it is: {'a': 2, 'b': 1}
有序词典就像常规词典一样,但是它们记住插入项目的顺序。在有序字典上进行迭代时,将按其键首次添加的顺序返回项目。
因此,它仅按添加到字典中的顺序进行排序>>
您可以通过以下键来构建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]))
[加上Brian的回答,OrderedDict
确实很棒。这是为什么: