Python 3.6+;:两个键相同但顺序不同的词典的相等性

Python 3.6+;:两个键相同但顺序不同的词典的相等性,python,Python,对于定义为的两个词典d1和d2 d1 = {'foo':123, 'bar':789} d2 = {'bar':789, 'foo':123} 键的顺序在Python 3.6+中保留。当我们循环浏览字典并打印条目时,这一点很明显 >>> for x in d1.items(): ... print(x) ... ('foo', 123) ('bar', 789) >>> for x in d2.items(): ... print(x)

对于定义为的两个词典
d1
d2

d1 = {'foo':123, 'bar':789}
d2 = {'bar':789, 'foo':123}
键的顺序在Python 3.6+中保留。当我们循环浏览字典并打印条目时,这一点很明显

>>> for x in d1.items():
...     print(x)
...
('foo', 123)
('bar', 789)


>>> for x in d2.items():
...     print(x)
...
('bar', 789)
('foo', 123)

为什么Python仍然考虑<代码> D1和<代码> D2<代码>相等?

>>> d1 == d2
True

字典是散列表,顺序并不重要。在Python3.6+中,字典是按插入顺序的,但这正是它们的实现方式。秩序对平等并不重要。如果你想让秩序在平等中发挥作用,就使用有序的信息技术

from collections import OrderedDict

d1 = OrderedDict({'foo':123, 'bar':789})
d2 = OrderedDict({'bar':789, 'foo':123})

print(d1 == d2) # False

字典是散列表,顺序并不重要。在Python3.6+中,字典是按插入顺序的,但这正是它们的实现方式。秩序对平等并不重要。如果你想让秩序在平等中发挥作用,就使用有序的信息技术

from collections import OrderedDict

d1 = OrderedDict({'foo':123, 'bar':789})
d2 = OrderedDict({'bar':789, 'foo':123})

print(d1 == d2) # False

直到Python3.6,字典都是无序的。因此,检验平等性的唯一明智方法是忽略顺序。当Python3.6订购字典时,这是一个实现细节。由于Python3.7,可以依赖插入顺序。但是改变行为只考虑字典是相等的,如果键以相同的顺序会破坏大量的代码。坦率地说,我认为比较字典而不考虑排序更有用。

直到Python 3.6之前,字典都是无序的。因此,检验平等性的唯一明智方法是忽略顺序。当Python3.6订购字典时,这是一个实现细节。由于Python3.7,可以依赖插入顺序。但是改变行为只考虑字典是相等的,如果键以相同的顺序会破坏大量的代码。坦率地说,我认为比较字典而不考虑顺序更有用。

为了向后兼容,除其他外。字典不是语义有序的数据结构,即使它们保留插入顺序。如果您想要语义有序的词典,请使用
orderedict
-
orderedict([((“foo”,123),(“bar”,789)])!=OrderedDict([((“bar”,789),(“foo”,123)])
。为了向后兼容,除其他外。字典不是语义有序的数据结构,即使它们保留插入顺序。如果您想要语义有序的词典,请使用
orderedict
-
orderedict([((“foo”,123),(“bar”,789)])!=OrderedDict([((“bar”,789),(“foo”,123)])
。事实上,在Python 3.5之前,
dicts的插入顺序没有得到维护。。在PythonTrue的任何未来版本中,插入顺序都会再次发生变化,尽管这样做的可能性很小,因为PythonTrue无法向后兼容。在3.5中它是一个实现细节,在3.7中它是正式的。是的-从Python-3.7开始,
dict
保持插入顺序。@Error syntacticalreforse它是3.6中的一个实现细节,而不是3.5。事实上,直到Python 3.5,插入顺序都没有为
dict
保持。。在PythonTrue的任何未来版本中,插入顺序都会再次发生变化,尽管这样做的可能性很小,因为PythonTrue无法向后兼容。在3.5中它是一个实现细节,在3.7中它是正式的。是的-在Python-3.7中,
dict
维护插入顺序。@Error syntactical懊悔它是3.6中的一个实现细节,而不是3.5。非常正确。我更喜欢顺序不重要,它使许多代码更容易。非常正确。我更喜欢顺序不重要,它使许多代码更容易。