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


178

我一直在阅读Core Python编程书,作者展示了一个类似的示例:

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

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

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

Answers:


191

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

请参阅常见序列操作

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

还可以进行值比较以获取更多详细信息:

内置集合之间的词法比较如下:

  • 为了使两个集合比较相等,它们必须是同一类型,具有相同的长度,并且每对对应的元素必须比较相等(例如, [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:参考问题/programming/36911617/python-2-tuple-comparison:仅当第一个元组的任何元素大于对应的元组时,才认为该元组比另一个元组“更大”一秒。


4
在谈论<和时,这可能会产生误导>。例如,(0, 1) < (1, 0)计算为True

4
@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)差不多。
Michael Scott Cuthbert

8
@ J.Money为什么您会误导您?

1
@CharlieParker <>并不意味着“更小则”和“大于”,而是“到来之前”和“之后谈到”:如此(0, 1)“到来之前”(1, 0)

3
@Don我猜不清楚我们对元组施加哪种类型的排序。我猜想python只是通过首先检查最大有效数字并继续前进来将其视为死亡来对待数字……(以元素明智的方式)
Charlie Parker

20

Python文档做解释。

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


现在从此答案链接的页面似乎不包含引用的文本。
16:09洗漱

0

Python 2.5的文档解释了它做好。

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

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

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


0
在进行整数比较之前,我有些困惑,因此我将通过一个示例来说明它对初学者更友好

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小于三-按字典顺序-)

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

认为它是一个元素,在另一个字母前不是一个元素大于一个元素,在这种情况下,将所有元组元素视为一个字符串。


2
(1,2,3) > (1,2,2)True
维沙尔·辛格
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.