Python 3.6+:具有相同键但顺序不同的两个字典的相等性

时间:2019-11-20 18:24:53

标签: python

对于定义为

的两个字典d1d2
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仍然认为d1d2相等?

>>> d1 == d2
True

2 个答案:

答案 0 :(得分:6)

字典是哈希表,顺序无关紧要。在python 3.6+中,字典按插入顺序排列,但这就是它们的实现方式。秩序对平等并不重要。如果您想让订单事项平等,请使用OrderedDict。

from collections import OrderedDict

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

print(d1 == d2) # False

答案 1 :(得分:2)

在Python 3.6之前,字典是无序的。因此,检验平等的唯一明智的方法是忽略顺序。当Python 3.6订购字典时,这是一个实现细节。从Python 3.7开始,可以依赖插入顺序。但是,如果将行为更改为仅在键的顺序相同时才认为字典相等,则会破坏整个代码。坦率地说,我认为比较字典而不考虑顺序会更有用。