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

245

我一直在阅读《Python核心编程》这本书,作者给出了一个例子:

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

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

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

4个回答

267

Tuples将按位置进行比较: 第一个元组的第一项将与第二个元组的第一项进行比较;如果它们不相等(即第一个大于或小于第二个),则这是比较结果,否则将考虑第二项,然后是第三项,以此类推。

请参阅常见序列操作

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

还可以查看值比较以获取更多详细信息:

内置集合之间的字典比较按以下方式进行:

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

如果不相等,则将按它们的第一个不同元素进行排序。例如,cmp([1,2,x],[1,2,y])返回与cmp(x,y)相同的结果。如果对应元素不存在,则较短的序列被视为较小(例如,[1,2] < [1,2,3]返回True)。

注意1<> 不表示“小于”和“大于”,而是表示“在前面”和“在后面”:因此,(0, 1)“在前面”, (1, 0)。

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

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


7
当涉及到 <> 时,这可能会导致误解。例如,(0, 1) < (1, 0) 的结果为 True - None
4
尝试使用以下代码:x = tuple([0 for _ in range(n)]),并对y执行相同的操作。将n设置为100、1000、10000和100000,并运行%timeit x==y。得到的计时值分别是0.5微秒、4.6微秒、43.9微秒和443微秒,这几乎接近于实际可达到的O(n)。 - Michael Scott Asato Cuthbert
10
@J.Money,你为什么认为这可能会导致误解? - Don
2
@CharlieParker <> 不是指“小于”和“大于”,而是指“在前面”和“在后面”:因此,(0, 1) “在前面”,(1, 0) - Don
3
@Don 我猜我们不清楚要对元组施加什么类型的排序。我猜Python只是通过首先检查最大有效数字,然后继续以逐个元素的方式来打破死结...(in an element wise fashion) - Charlie Parker
显示剩余5条评论

29

Python文档中有详细解释。

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


1
此答案链接的页面似乎不包含引用的文本。 - plugwash
我认为引用文本的更好链接是:https://docs.python.org/3/reference/expressions.html#value-comparisons。需要向下滚动一点才能找到引用文本,但使用给定的链接,需要向上滚动,这是出乎意料的,大多数人可能不会这样做。 - bartonstanley

1

Python 2.5 文档对此有很好的解释。

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

如果不相等,则按照它们的第一个不同元素排序。例如,cmp([1,2,x], [1,2,y]) 的返回值与 cmp(x,y) 相同。如果相应元素不存在,则较短的序列排在前面(例如,[1,2] < [1,2,3])。

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


0

a = ('A','B','C') # 将其视为字符串 "ABC" b = ('A','B','D')

A 被转换为相应的 ASCII ord('A') #65 其他元素同理。

所以, >> a>b # True 你可以将其视为字符串比较(实际上确实如此)

整数也是同样的道理。

x = (1,2,2) # 将其视为字符串 "123" y = (1,2,3) x > y # False

因为(1 不大于 1,继续比较下一个;2 不大于 2,继续比较下一个;2 小于 3 - 按字典顺序 -)

关键点在上面的答案中提到了:

将其视为按字典顺序排列,而不是按大小排列,并且在这种情况下将所有元组元素视为一个字符串。


3
(1,2,3) > (1,2,2) 的结果为 True。这表示元组 (1,2,3) 在字典序中大于元组 (1,2,2) - Vishal Singh
(20,2) > (9,30) 返回 True,但是 202 不大于 930,所以对于整数来说,它是按位置比较的,而不仅仅是连接。 - mherzog
1
你的解释是错误的,因为“2在字典顺序下小于3”并不是比较原理。请使用像11和3这样的数字再试一次。每个位置上的元素对都使用该数据类型的__gt__方法进行比较。例如,虽然对于整数而言11 > 2为True,但对于字符串而言'11' > '2'为False。对于元组也是如此,(11, 33) > (2, 4)为True,而('11', '33') > ('2', '4')为False。单词“字典顺序”通常意味着“将所有字符字符串视为字符串,即使它们表示数字”。不是字符串的元组元素不会被视为字符串。 - Chris Johnson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接