Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 词典与有序词典的区别_Python_Python 3.x_Dictionary_Ordereddictionary - Fatal编程技术网

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
    对象,因为它支持与其他
    映射
    对象(如)进行相等性测试

  • orderedict
    保留Brian解释的插入顺序。除此之外,它还有一个按后进先出顺序返回(键、值)对的方法。因此,您也可以将其用作映射的“堆栈”

您不仅可以获得dict的全部功能,还可以获得一些很酷的技巧。

自年起,dict内置的一项新改进是:

dict对象的插入顺序保留性质已被声明为Python语言规范的正式部分


这意味着不再需要
OrderedDict
,从CPython 3.6开始,所有其他Python实现都从Python 3.7开始,bultin
dict
是按插入的顺序进行排序的。这使得
dict
orderedict
实际上是相同的

列出其余的差异。最重要的是

  • 用于
    OrderedDict
    的相等操作检查匹配的顺序。
还有一些小的实际差异:

  • 不接受任何参数,而接受可选的
    last=
    参数,该参数允许您弹出第一项而不是最后一项
  • orderedict
    有一种方法可以有效地将元素重新定位到末尾或开头。使用
    dict
    s,您可以通过重新插入将密钥移动到末尾:
    mydict['key']=mydict.pop('key')
  • 在Python3.8之前,您可以执行
    reversed(OrderedDict())
    ,但是
    reversed({})
    会引发
    TypeError:“dict”对象是不可逆的
    错误,因为他们在对
    dict
    进行排序时忘记向其添加dunder方法。这个问题现在已经解决了
此外,还存在一些潜在的差异,这可能意味着您可以使用
OrderedDict
,为某些特定用例获得更好的性能:

  • 常规的
    dict
    被设计为非常擅长映射 操作。跟踪插入顺序是次要的
  • OrderedDict
    被设计为擅长重新排序操作。 空间效率、迭代速度和更新性能 手术是次要的
  • 在算法上,
    OrderedDict
    可以处理频繁的重新排序 操作优于dict。这使得它适合于跟踪 最近的访问(例如,在中)

有关Python字典如何实现的详细信息,请参见此部分。

并且要将
dict
转换为
orderedict
(最初)键按排序顺序排列,您需要执行:
od=orderedict(sorted(d.items())
。请注意,dict现在默认情况下是按插入顺序排列的。Hmm,在更高的python版本中,这种行为会改变吗?它似乎保持了Python 3.7.8@RakshitKothari中的顺序是的!请参见另一个答案-在Python 3.7+
dict
中,dict现在的行为与
OrderedDict
相同。它在速度和内存方面确实有价格。