OrderedDict 比较不一致

OrderedDict comparison inconsistency

提问人:shx2 提问时间:4/26/2020 最后编辑:DeepSpaceshx2 更新时间:4/26/2020 访问量:97

问:

我注意到 s 和 s 之间的关系存在这种惊人的不一致。从文档中:dictOrderedDict

OrderedDict 对象之间的相等性测试是顺序敏感的,并且实现为 .对象和其他 Mapping 对象之间的相等性测试与常规字典一样不区分顺序。这允许在使用常规字典的任何位置替换对象。list(od1.items())==list(od2.items())OrderedDictOrderedDict

这是一个问题,因为它违反了相等的传递属性,如下所示。

我的问题:这是否有充分的理由(除了“......允许替换 OrderedDict 对象...“)?有没有其他标准的 python 类型违反了相等的传递属性

以下测试都应该是等效的,但它们不是:

od1 = OrderedDict([(1,1), (2,2)])
od2 = OrderedDict([(2,2), (1,1)])
d = dict(od1)
d   == od1 == od2 # False
od1 == d   == od2 # True ...
od1 == od2 == d   # False

在我看来,应该是这样:

  1. 集合是有序的,即顺序是其的一部分,在这种情况下,不应定义与无的比较(与将 a 与 a 进行比较相同dictlistset)

  2. 集合未排序,在这种情况下。该顺序仍可保持迭代,但不被视为的一部分。od1==od2

python 字典 比较 相等 ordereddict

评论

0赞 martineau 4/26/2020
您使用的是哪个版本的 Python?请相应地标记您的问题。
0赞 shx2 4/26/2020
@martineau我没有标记它,因为 afaik 这适用于所有版本
0赞 martineau 4/26/2020
我问是因为“......和其他 Mapping 对象对顺序不敏感,就像常规字典一样“,这是您问题中引用的一部分——常规字典开始正式保留顺序,就像 Python 3.7 中的 s do(以及 cPython 3.6 中的非正式操作)一样——所以它似乎是相关的。OrderedDict
0赞 martineau 4/26/2020
这两个词典是相等的,因为它们的内容顺序不同,就像两个具有相同元素的列表以不同的顺序排列一样。
1赞 martineau 4/27/2020
你是对的——我错了。3.0 文档说“当且仅当字典具有相同的(键、值)对(无论顺序如何)时,字典比较相等”。你也说得对,常规 s 和 s 在这方面的行为不一致。后者的文档解释说:“对象之间的相等性测试是顺序敏感的,并且以 ” 的形式实现。dictOrderedDictOrderedDictlist(od1.items())==list(od2.items())

答: 暂无答案