【问题标题】:How does list comparison work? [duplicate]列表比较如何工作? [复制]
【发布时间】:2017-11-29 08:24:16
【问题描述】:

我想比较两个列表。例如:

a = [8,9,9,11] 

b = [8,7,20,10]

if a >= b :

   print "true"

为什么会打印"true"?我想像这样垂直比较值:

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)
  • 默认情况下,元组(或列表)的比较类似于比较字符串的方式:比较检查相应的项目,直到找到不相等的对(或一个集合用完项目),然后比较停止。
  • @PM2Ring 那为什么会返回True
  • @Ev.Kounis 因为第一次两个列表元素不相等是 97 所以它返回 True 并忽略其他元素

标签: python python-2.7


【解决方案1】:

您可以使用列表推导和所有功能如下:

代码:

a = 8,9,9,11 
b = 8,7,20,10
print all([(a > b) for a, b in zip(a,b)])

输出:

False

【讨论】:

  • 您应该将生成器表达式传递给allany,而不是列表推导式。这两个函数都是短路的,因此一旦结果明确,它们就会停止处理。如果您向他们提供一个列表组合,则必须在他们开始工作之前构建整个列表,但如果您向他们提供一个 gen exp,那么只会生成确定结果所需的尽可能多的项目。
【解决方案2】:

您可以使用列表推导来比较两个列表元素,然后使用all 函数检查所有比较是否为True

a = [8,9,9,11]
b = [8,7,20,10]
all(a[i]>=b[i] for i in range(len(a))) # False

【讨论】:

  • 另外,OP(可能)不想比较每一对元素,所以双循环是不正确的。
  • @PM2Ring ,是的,我明白你的意思,但是由于不能在列表理解中使用break,当第一次出现False 时我该如何阻止它(当然是列表理解)?跨度>
  • 您使用生成器表达式:all(a[i]>=b[i] for i in range(len(a)))。更好的是,使用直接迭代而不是索引:all(a >= b for a, b in zip(a, b))。这将安全地处理长度不同的元组。
猜你喜欢
  • 2015-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-10
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2021-10-04
相关资源
最近更新 更多