【问题标题】:In Python why is [2] less than (1,)?在 Python 中,为什么 [2] 小于 (1,)?
【发布时间】:2013-06-28 19:03:37
【问题描述】:

背景

我一直在试图弄清楚为什么我的 AI 会做出一些疯狂的举动,并且我将问题追溯到使用 Python 2.7.2 时的以下行为

>>> print [2]>[1]
True
>>> print (2,)>(1,)
True
>>> print [2]>(1,)
False                 (WHY?)

>>> print [2]<[1]
False
>>> print (2,)<(1,)
False
>>> print [2]<(1,)
True                  (WHY?)

似乎列表总是小于元组。

这不是我对documentation 的期望

元组和列表使用比较的字典顺序进行比较 对应的元素。这意味着要比较相等,每个元素 必须比较相等并且两个序列必须是相同的类型并且 长度相同。

如果不相等,则序列的顺序与它们的第一个相同 不同的元素。例如, cmp([1,2,x], [1,2,y]) 返回 与 cmp(x,y) 相同。如果对应的元素不存在,则 首先排序较短的序列(例如,[1,2]

问题

这里发生了什么?我是否允许比较元组和列表 - 或者我是否只允许比较同一类型与自身?

【问题讨论】:

标签: python


【解决方案1】:

比较时不强制序列,因此比较它们的类型名称。

>>> 'list' < 'tuple'
True

【讨论】:

  • 此行为在哪里指定?
  • 对于它的价值,python 确实指定比较是按类型完成的,但它没有指定类型按名称进行比较。我相信这是 Cpython 中的行为,但其他实现可能会给出不同的结果。
  • @MattBallsection 5.3底部:CPython实现细节:除数字外的不同类型的对象按类型名称排序;不支持正确比较的相同类型的对象按其地址排序。
  • 原因是“不同类型的对象,除了不同的数值类型和不同的字符串类型,永远不会比较相等;这样的对象排序一致但任意(这样对异构数组进行排序会产生一致的结果) ”。在此基础上,使用类型名称是足够合理的。我很想看到一个__future__ 选项来启用 3.x 风格的比较。
  • @mgilson 我有点开玩笑。但是,我认为 python 2 不会像 python 基金会认为的那样自然消亡。如果它的运行时间足够长,需要这么多维护版本,他们可能会投降并调用后续版本 2.8。
【解决方案2】:

它们不是同一类型。

每个元素必须比较相等并且两个序列必须是同一类型并且具有相同的长度

因此,比较是根据类型进行的,而不是根据存储在序列中的实际数据。在 python3.x 上,这种比较会引发TypeError

Python 3.2 (r32:88445, May 11 2011, 09:23:22) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> [2] > (1,)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: list() > tuple()

【讨论】:

  • 啊,我明白了,我又一次无法阅读。非常感谢!我喜欢在 Python 3 中我不会犯这个错误。我现在很想最后更新!
  • @PeterdeRivaz -- 值得一提的是,序列比较相等。下一段更详细地处理了丰富的比较,但并没有清楚地表明它们需要是相同的类型。
  • @PeterdeRivaz -- FWIW,我认为那里的措辞模棱两可,值得写一封电子邮件给 docs@python.org 以尝试改进文档。
猜你喜欢
  • 2022-04-12
  • 1970-01-01
  • 2014-07-04
  • 2016-05-14
  • 2013-08-17
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
  • 2011-10-31
相关资源
最近更新 更多