Python 词典与有序词典的区别
我正在找一本分类词典。但是Python 词典与有序词典的区别,python,python-3.x,dictionary,ordereddictionary,Python,Python 3.x,Dictionary,Ordereddictionary,我正在找一本分类词典。但是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(): p
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
不会为您排序元素,它会保留您给它的顺序
如果你想“分类”一本字典,你可能需要
>>> sorted(d.items())
[('a', 1), ('b', 2), ('c', 3)]
有序词典与常规词典一样,但它们记住插入项的顺序。当在一个有序字典上迭代时,这些项将按照它们的键第一次添加的顺序返回
因此,它只按添加到dict中的顺序进行排序
您可以按键构建OrderedDict,如下所示
ordedict=orderedict(已排序(mydict.items(),key=lambda t:t[0])
或者就像@ShadowRanger在评论中提到的那样
ordedict=orderedict(已排序(d.items())
如果要按值排序
ordedict=orderedict(已排序(mydict.items(),key=lambda t:t[1])
更多信息请参见补充Brian的答案,
OrderedDict
非常棒。原因如下:
- 您可以将其用作简单的
对象,因为它支持与其他dict
对象(如)进行相等性测试映射
保留Brian解释的插入顺序。除此之外,它还有一个按后进先出顺序返回(键、值)对的方法。因此,您也可以将其用作映射的“堆栈”orderedict
这意味着不再需要
OrderedDict
,从CPython 3.6开始,所有其他Python实现都从Python 3.7开始,bultindict
是按插入的顺序进行排序的。这使得dict
和orderedict
实际上是相同的
列出其余的差异。最重要的是
- 用于
的相等操作检查匹配的顺序。OrderedDict
- 不接受任何参数,而接受可选的
参数,该参数允许您弹出第一项而不是最后一项last=
有一种方法可以有效地将元素重新定位到末尾或开头。使用orderedict
s,您可以通过重新插入将密钥移动到末尾:dict
mydict['key']=mydict.pop('key')
- 在Python3.8之前,您可以执行
,但是reversed(OrderedDict())
会引发reversed({})
错误,因为他们在对TypeError:“dict”对象是不可逆的
进行排序时忘记向其添加dunder方法。这个问题现在已经解决了dict
OrderedDict
,为某些特定用例获得更好的性能:
- 常规的
被设计为非常擅长映射 操作。跟踪插入顺序是次要的dict
被设计为擅长重新排序操作。 空间效率、迭代速度和更新性能 手术是次要的OrderedDict
- 在算法上,
可以处理频繁的重新排序 操作优于dict。这使得它适合于跟踪 最近的访问(例如,在中)OrderedDict
有关Python字典如何实现的详细信息,请参见此部分。并且要将
dict
转换为orderedict
(最初)键按排序顺序排列,您需要执行:od=orderedict(sorted(d.items())
。请注意,dict现在默认情况下是按插入顺序排列的。Hmm,在更高的python版本中,这种行为会改变吗?它似乎保持了Python 3.7.8@RakshitKothari中的顺序是的!请参见另一个答案-在Python 3.7+dict
中,dict现在的行为与OrderedDict
相同。它在速度和内存方面确实有价格。