一个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)]
所以a OrderedDict
不会为你订购元素,它会保留 你给它的顺序.
如果你想"排序"字典,你可能想要
>>> 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) #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}