元组比较在 Python 中是如何工作的?

Posted

技术标签:

【中文标题】元组比较在 Python 中是如何工作的?【英文标题】:How does tuple comparison work in Python? 【发布时间】:2011-07-14 14:52:33 【问题描述】:

我一直在看Core Python编程书,作者举了一个例子:

(4, 5) < (3, 5) # Equals false

所以,我想知道,它如何/为什么等于 false? python如何比较这两个元组?

顺便说一句,书中没有解释。

【问题讨论】:

【参考方案1】:

元组逐个位置进行比较: 第一个元组的第一项与第二个元组的第一项进行比较;如果它们不相等(即第一个大于或小于第二个),那么这是比较的结果,否则考虑第二个项目,然后考虑第三个等等。

见Common Sequence Operations:

相同类型的序列也支持比较。特别是,元组和列表通过比较相应的元素来按字典顺序进行比较。这意味着要比较相等,每个元素必须比较相等,并且两个序列必须是相同类型且具有相同长度。

也可以Value Comparisons了解更多详情:

内置集合之间的字典比较工作如下:

要比较相等的两个集合,它们必须是相同的类型,具有相同的长度,并且每对对应的元素必须比较相等(例如,[1,2] == (1,2) 为 false,因为类型不同)。 支持顺序比较的集合的顺序与其第一个不相等的元素相同(例如,[1,2,x] &lt;= [1,2,y]x &lt;= y 具有相同的值)。如果对应的元素不存在,则先排序较短的集合(例如,[1,2] &lt; [1,2,3] 为真)。

如果不相等,则序列的排序与其第一个不同的元素相同。例如, cmp([1,2,x], [1,2,y]) 返回与 cmp(x,y) 相同的结果。如果对应的元素不存在,则认为较短的序列较小(例如,[1,2]

注 1&lt;&gt; 不是“小于”和“大于”而是“在之前”和“之后”:所以 (0, 1)"之前”(1, 0)。

注意 2:元组不能被视为 n 维空间中的向量,根据它们的长度进行比较。

注3:参考问题https://***.com/questions/36911617/python-2-tuple-comparison:不要认为只有第一个元组的任何元素大于第二个对应的元组时,元组才“大于”另一个元组。

【讨论】:

这在谈论 &lt;&gt; 时可能会产生误导。例如,(0, 1) &lt; (1, 0) 的计算结果为 True @CMCDragonkai -- 是的。尝试:x = tuple([0 for _ in range(n)]) 并为 y 做同样的事情。设置 n=100、1000、10,000 和 100,000 并运行 %timeit x==y 分别给出了 0.5、4.6、43.9 和 443 微秒的计时值,这大约是您实际上可以得到的接近 O(n) 的时间。跨度> @J.Money 为什么你认为它会产生误导? @CharlieParker &lt;&gt; 不是指“小于”和“大于”,而是“在之前”和“之后”:所以(0, 1)“在之前”@987654339 @ @Don 我想我们不清楚要对元组施加什么类型的排序。我猜python只是通过首先检查最大的有效数字并将其视为数字,然后继续打破死亡......(以元素明智的方式)【参考方案2】:

Python documentation 确实解释了它。

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

【讨论】:

现在从这个答案链接的页面似乎不包含引用的文本。 我相信引用文本的更好链接是:docs.python.org/3/reference/expressions.html#value-comparisons。确实需要向下滚动一点才能找到引用的文本,但是对于给定的链接,必须向上滚动,这是出乎意料的,而且大多数人可能不会这样做。【参考方案3】:

python 2.5 documentation 解释得很好。

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

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

不幸的是,该页面似乎在更新版本的文档中消失了。

【讨论】:

【参考方案4】: 我之前对整数比较有一些困惑,所以我会用一个例子来解释它对初学者更友好

a = ('A','B','C') # see it as the string "ABC" b = ('A','B','D')

A 被转换成其对应的 ASCII ord('A') #65 与其他元素相同

所以, >> a>b # True 您可以将其视为字符串之间的比较(实际上是这样)

整数也一样。

x = (1,2,2) # see it the string "123" y = (1,2,3) x > y # False

因为(1不大于1,移到下一个,2不大于2,移到下一个2小于3-按字典序-)

上面的答案中提到了重点

将其视为一个元素在另一个按字母顺序排列的元素之前,而非元素大于一个元素,在这种情况下,将所有元组元素视为一个字符串。

【讨论】:

(1,2,3) &gt; (1,2,2)True

以上是关于元组比较在 Python 中是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

如何在python字典中访问/断言元组键值

Python 2 如何比较字符串和整数?为啥列表比较大于数字,而元组大于列表?

比较 2 个相同大小的元组列表:比较和交换

Python 元组遍历排序操作方法

Python:元组列表:比较所有元组并检索元组的元素不等于任何其他元组的元组

Python 元组+集合+随机