元组比较在 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] <= [1,2,y]
与x <= y
具有相同的值)。如果对应的元素不存在,则先排序较短的集合(例如,[1,2] < [1,2,3]
为真)。
如果不相等,则序列的排序与其第一个不同的元素相同。例如, cmp([1,2,x], [1,2,y]) 返回与 cmp(x,y) 相同的结果。如果对应的元素不存在,则认为较短的序列较小(例如,[1,2]
注 1:<
和 >
不是“小于”和“大于”而是“在之前”和“之后”:所以 (0, 1)"之前”(1, 0)。
注意 2:元组不能被视为 n 维空间中的向量,根据它们的长度进行比较。
注3:参考问题https://***.com/questions/36911617/python-2-tuple-comparison:不要认为只有第一个元组的任何元素大于第二个对应的元组时,元组才“大于”另一个元组。
【讨论】:
这在谈论<
和 >
时可能会产生误导。例如,(0, 1) < (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 <
和 >
不是指“小于”和“大于”,而是“在之前”和“之后”:所以(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) > (1,2,2)
给True
以上是关于元组比较在 Python 中是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章
Python 2 如何比较字符串和整数?为啥列表比较大于数字,而元组大于列表?