【问题标题】:How does element-wise comparison of dicts, lists and tuples work in Python?字典、列表和元组的元素比较如何在 Python 中工作?
【发布时间】:2016-01-26 23:02:33
【问题描述】:
[1,3] > [1,2]
True

好吧,听起来很合理,如果没有别的,在直观的层面上。

(3,2) <= (3,2)
True

同上。

但是是什么原因:

(4,3) >= (1,1,1)
True

如果我们在这里比较values()

{'a':1, 'b':2} < {'a':1, 'b':3}
True

那我们为什么要在这里比较keys()

{'a':1, 'b':2} < {'x':1, 'y':2}
True

我在任何地方都找不到关于这些现象的文档。

【问题讨论】:

  • 字典不是序列。不要比较它们。在 Python 2 中,它会起作用,产生大部分一致但毫无意义的结果。在 Python 3 中,它会引发 TypeError。
  • 另外,不要妄下结论。在您的任何一个示例中,dict 比较逻辑都没有比较 keys()values()
  • @user2357112 我知道有人会在我的结论跳跃时叫我出来。好的。现在解释一下正在发生什么,如果不是正在比较的键和值。
  • 如果你真的想知道,you can take a look under the hood。简短的回答是结果毫无意义,产生结果根本就是设计错误。
  • 而 Python 3 一直致力于修复此类错误(在这种情况下引发 TypeError)。

标签: python list dictionary tuples python-2.x


【解决方案1】:

(4,3) 大于 (1,1,1)"mouse" 大于 "elephant" 的原因完全相同。 Lexicographical order。对于字符串,您可能非常熟悉它。您应该希望字典中“大象”出现在“鼠标”之前,对吧?

【讨论】:

  • 有趣的是,我最近发布了一个问题,“为什么 123
  • @Pyderman 我想我在你打字的时候把它删掉了 :-)(我对字典没什么好说的)
【解决方案2】:

所有这些都非常清楚地记录在Python Language Reference 5.9 Comparisons中。

特别是:

  • 元组和列表通过比较对应元素按字典顺序进行比较。这意味着要比较相等,每个
    元素必须比较相等并且两个序列必须相同
    类型并具有相同的长度。 如果不相等,则序列的排序与其第一个不同的元素相同。例如,cmp([1,2,x], [1,2,y]) 返回
    cmp(x,y) 相同。如果对应的元素不存在,
    首先排序较短的序列(例如,[1,2] [1,2,3])。
  • 映射(字典)比较相等当且仅当其排序的(key, value) 列表比较相等。 [1] 平等以外的结果
    一致地解决,但没有另外定义。 [2]

脚注在哪里

  1. 实现可以高效地计算这一点,无需构建列表或排序。

  2. 早期版本的 Python 使用排序(键、值)列表的字典比较,但这对于常见的 比较相等的情况。更早版本的 Python 仅按身份比较字典,但这引起了意外 因为人们期望能够测试字典的空虚 通过将其与{} 进行比较。


在 Python 3 中比较字典会引发 TypeError。同样具有不兼容元素的序列:

>>> {} < {1:2}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: dict() < dict()
>>> ['a'] < [1]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: str() < int()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    相关资源
    最近更新 更多