在键乱序时比较字典列表

Comparing list of dictionaries when the keys are out of order

提问人:Amanda 提问时间:3/14/2020 最后编辑:Ch3steRAmanda 更新时间:3/14/2020 访问量:2473

问:

我有 2 个词典列表。

a = [{"name": "hello", "city": "xyz"},{"city": "rty", "name": "ert"}]
b = [{"city": "xyz","name": "hello"},{"name": "ert", "city": "rty"}]

以上两个列表是相等的。但是如果我使用 进行比较,它会给出 .当键可能乱序时,如何检查两个词典列表之间的是否相等?==False

python-3.x 列表 字典 相等

评论

3赞 Michael H. 3/14/2020
我得到......使用Python 3.6.3Truea == b
1赞 DARK_C0D3R 3/14/2020
您使用的是哪个 Python 版本,请说明
0赞 kederrac 3/14/2020
也许你们认为 dict elemnts 在列表中的位置可能不同?
0赞 Amanda 3/14/2020
@kederrac是的......
0赞 kederrac 3/14/2020
@Amanda如果是这样的话,你可以看看我的答案

答:

1赞 Kelly Bundy 3/14/2020 #1

我很确定你以某种方式犯了一个错误。我和其他人得到:True

>>> a = [{"name": "hello", "city": "xyz"},{"city": "rty", "name": "ert"}]
>>> b = [{"city": "xyz","name": "hello"},{"name": "ert", "city": "rty"}]
>>> a == b
True

这就是它应该做的

关于 OrderedDict 的文档说(强调我的):

对象和其他对象之间的相等性测试与常规字典一样不区分顺序OrderedDictMapping

关于价值比较的文档是这样说的,这些字典就是这种情况:

当且仅当映射(键、值)对相等时,映射(实例)才会比较相等。dict

4赞 kederrac 3/14/2020 #2

如果您想知道每个列表是否具有相同的字典,即使字典元素在列表中可能不在相同的位置(正如您在注释中提到的),您可以使用:

a = [{"name": "hello", "city": "xyz"},{"city": "rty", "name": "ert"}]
b = [{"name": "ert", "city": "rty"}, {"city": "xyz","name": "hello"}]

print(a == b)
print(sorted(a, key=lambda d: sorted(d.items())) == sorted(b, key=lambda d: sorted(d.items())))

输出:

False
True