Python中元组比较是怎样工作的?

249 投票
4 回答
255581 浏览
提问于 2025-04-16 13:37

我最近在读一本叫做《核心Python》的编程书,书里的一个例子是这样的:

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

所以,我在想,为什么这个结果是假的呢?Python是怎么比较这两个元组的?

顺便说一下,书里没有解释这个。

4 个回答

1

Python 2.5 的文档中,有很好的解释。

元组和列表的比较是通过比较它们对应的元素来进行的。这就是说,要想两个序列被认为是相等的,每个元素都必须相等,而且这两个序列必须是同一种类型,并且长度也要相同。

如果不相等,那么它们的顺序就取决于第一个不同的元素。例如,cmp([1,2,x], [1,2,y]) 的结果和 cmp(x,y) 是一样的。如果某个对应的元素不存在,那么较短的序列会排在前面(比如说,[1,2] < [1,2,3])。

可惜的是,这个页面在更新后的文档中似乎消失了。

31

Python的官方文档里有解释这个问题。

元组和列表的比较是通过逐个比较它们里面的元素来进行的。这就是说,要想两个元组或列表被认为是相等的,它们每一个元素都得相等,而且这两个序列必须是同一种类型,并且长度也要一样。

273

元组是逐个位置进行比较的:第一个元组的第一个元素会和第二个元组的第一个元素进行比较;如果它们不相等(也就是说,第一个元素大于或小于第二个元素),那么比较的结果就是这个。如果相等,就继续比较第二个元素,然后是第三个,以此类推。

可以参考常见序列操作

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

还有值比较的更多细节:

内置集合之间的字典序比较是这样工作的:

  • 要使两个集合相等,它们必须是同一种类型,长度相同,并且每一对对应的元素都必须相等(例如,[1,2] == (1,2) 是假的,因为类型不同)。
  • 支持顺序比较的集合按照它们第一个不相等的元素的顺序进行排序(例如,[1,2,x] <= [1,2,y] 的值和 x <= y 是一样的)。如果对应的元素不存在,较短的集合会排在前面(例如,[1,2] < [1,2,3] 是真的)。

如果不相等,序列的排序和它们第一个不同的元素相同。例如,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:不要认为一个元组“比”另一个元组大,仅仅因为第一个元组的某个元素大于第二个元组的对应元素。

注意 4:正如 @david Winiecki 在评论中提到的,对于两个长度不同的元组,前一个到达末尾时,如果之前的部分相等,则被认为是较小的:(1, 2) < (1, 2, 3),因为 1=1,2=2,然后第一个元组结束。

撰写回答