为什么OrderedDict没有实现比较运算符

时间:2017-12-13 21:17:01

标签: python python-3.x comparison-operators

今天早些时候我问question,因为我无法真正理解使用丰富比较方法的比较运算符的实现。谢谢你接受的答案,以便很好地解释两者之间的差异。

基本上,根据我的理解,Python 3停止使用__cmp__()魔术方法。从现在开始,

  

排序比较运算符(<,< =,> =,>)引发TypeError   操作数没有有意义的自然顺序时的异常。

因此,我认为OrderedDict是有效的。但令我惊讶的是,

d1 = OrderedDict([(1,1)])
d2 = OrderedDict([(2,2)])
>>> dict1 < dict2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'collections.OrderedDict' and 'collections.OrderedDict'
>>> dict1.__lt__(dict2)
NotImplemented

那么,为什么OrderedDict没有实现比较运算符?

请注意,在链接问题的答案的评论中,我们开始讨论该主题。有一点是强调的,为什么假设插入顺序是你想要比较的东西?您可以随时实施自己的方式来明确地比较它们

然后为什么(即使在Python 3中),

list1 = [1,2,3]
list2 = [4,5,6]
>>> list1 < list2
True

不是类似的情况吗?

2 个答案:

答案 0 :(得分:4)

“有意义的自然排序”是指决定两个对象中哪一个更大的“自然”方式。它没有引用对象是否是有序集合。

OrderedDict可以对其条目强加一个排序,但两个OrderedDicts之间没有自然的排序关系。

答案 1 :(得分:0)

@scharette,我确实同意在某个角度下OrderedDict看起来像是一个具有O(1)访问时间的链表。 cpython的开发人员在对OrderedDict的C implementation的评论中分享了这个观点。

我对你的问题的回答很简单。 从来没有人想到

original proposal中没有比较运算符。

未通过bugs.python.orgPEP

添加任何提案

如果您觉得值得向OrderedDict添加比较运算符,请在https://bugs.python.org/

上提出增强请求