今天早些时候我问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
不是类似的情况吗?
答案 0 :(得分:4)
“有意义的自然排序”是指决定两个对象中哪一个更大的“自然”方式。它没有引用对象是否是有序集合。
OrderedDict可以对其条目强加一个排序,但两个OrderedDicts之间没有自然的排序关系。
答案 1 :(得分:0)
@scharette,我确实同意在某个角度下OrderedDict看起来像是一个具有O(1)访问时间的链表。 cpython的开发人员在对OrderedDict的C implementation的评论中分享了这个观点。
我对你的问题的回答很简单。 从来没有人想到)
original proposal中没有比较运算符。
添加任何提案如果您觉得值得向OrderedDict添加比较运算符,请在https://bugs.python.org/
上提出增强请求