How does list comparison work?
我想比较两个列表。例如:
1 2 3 4 5 6 7
| a = [8,9,9,11]
b = [8,7,20,10]
if a >= b :
print"true" |
为什么要打印"true"?我想像这样垂直比较这些值:
1 2 3 4 5 6 7
| 8 >= 8 is true
9 >= 7 is true
9 >= 20 is false but the program return true
11 >= 10 is true |
号
- 你是说你想要多数人的结果?
- 你能解释一下你要找的输出是什么吗?你只是想要一个False的结果,还是想要一个序列,例如(True, True, False, True)?
- 默认情况下,元组(或列表)的比较类似于字符串的比较方式:比较检查相应的项,直到找到不相等的对(或一个集合耗尽项),然后比较停止。
- @那么为什么返回True?
- @ev.kounis,因为第一次两个list元素不相等的是9和7,所以返回true并忽略其他元素。
您可以使用列表理解来比较两个列表元素,然后使用all函数检查所有比较是否为True:
1 2 3
| a = [8,9,9,11]
b = [8,7,20,10]
all(a[i]>=b[i] for i in range(len(a))) # False |
- 请看我对Mahesh Karia的评论
- 另外,op(可能)不希望比较每对元素,因此double for循环是不正确的。
- @pm2ring,是的,我明白你的意思,但是由于在列表理解中不能使用break,那么当第一个False出现时(当然是列表理解),我怎么能停止这种情况呢?
- 使用生成器表达式:all(a[i]>=b[i] for i in range(len(a)))。更好的是,使用直接迭代代替索引:all(a >= b for a, b in zip(a, b))。这样可以安全地处理长度不同的元组。
您可以使用列表理解和所有功能,如下所示:
代码:
1 2 3
| a = 8,9,9,11
b = 8,7,20,10
print all([(a > b) for a, b in zip(a,b)]) |
输出:
号
- 应该将生成器表达式传递给all或any,而不是列表理解。这两个功能都是短路的,所以一旦结果明确,它们就会停止处理。如果您向他们提供一个列表组件,那么在他们开始工作之前必须构建整个列表,但是如果您向他们提供一个gen exp,那么将只生成确定结果所需的尽可能多的项目。