为啥字典大小比较被删除了?

Posted

技术标签:

【中文标题】为啥字典大小比较被删除了?【英文标题】:Why were dictionary magnitude comparisons removed?为什么字典大小比较被删除了? 【发布时间】:2014-09-13 17:13:43 【问题描述】:

只是好奇,仅此而已。为什么在 Python3 中删除了字典大小比较 (> < >= <=)?删除它们的原因是什么?

例如:dictA > dictB

【问题讨论】:

什么是字典大小比较 我猜它类似于 if dict_a > dict_b:,它在 Python 2 中运行,但在 Python 3 中提供 TypeError: unorderable types 你可以尝试搜索相关的提交历史,这是公开的。它可能包含基本原理、PEP 链接或对邮件列表讨论的引用。 你的意思是simplification of ordering comparisons?这是在 Python 3.0 中完成的。 如果是这样,那么这与Is everything greater than None?和其他此类帖子密切相关。 【参考方案1】:

任意比较排序已从 Python 3 中移除,请参阅 Ordering Comparisons in the What's New in Python 3.0 documentation。

字典之间没有有意义的自然排序。 Python 2 只是假装可以很好地对混合列表进行排序,但这只会导致巨大的混乱。

以比较字符串和整数为例;在 Python 中,整数总是比字符串小

>>> 10 < "10"
True

无论如何,许多初学者都会尝试将字符串与整数进行比较;很自然地使用number = raw_input('Pick a number! '),然后尝试将其与整数进行比较;有时这会看起来就像它正在工作一样!在 Python 3 中,这现在是一个错误。

这同样适用于大多数对象;除非他们明确定义比较方法(__lt____gt__ 等),否则这些类型是不可排序的。这包括字典。

【讨论】:

根据 Mark Lutz 的“Learning Python”:“在 Python 3.X 中删除了字典的大小比较,因为在需要相等时它们会产生过多的开销”。所以我不明白,它们是出于有意义的原因还是出于性能原因而被删除? @antox:Python 2 的比较代码相当随意;字典没有自然的顺序。我不同意 Lutz 关于为什么将其删除的说法。 我不知道它是否有帮助,但它继续说:“......当需要平等时(平等使用 3.X 中的优化方案,它不会真正比较排序的键/值列表)” @antox:Python 3 version of dict_equal() 与version in Python 2 本质上没有区别;只有 Python 2 中的 dict_compare 实现在这里真正不同(在 Py 3 中不存在)。

以上是关于为啥字典大小比较被删除了?的主要内容,如果未能解决你的问题,请参考以下文章

为啥数学库经常被 FLOPS 比较?

如果字典可以通过`==`进行比较,为啥需要assertDictEqual?

字符串字典序

为啥在 C++ 20 中从标准库容器中删除了比较运算符?

python字典怎么比较值

为啥sql比较忽略大小写[重复]