【问题标题】:Checking if two lists share at least one element [duplicate]检查两个列表是否共享至少一个元素[重复]
【发布时间】:2014-06-17 18:17:22
【问题描述】:

我有两个列表,例如:

a = ["mail1", "mail2", "mail3", "mail4"]
b = ["mail2", "mail5"]

我想检查b 列表中的任何元素是否也出现在a 列表中。

我想知道是否有一种方法(以及它是什么)可以在没有 for 循环的情况下执行此操作。

我还想知道如何创建一个布尔值列表,其中每个值都是值a[i]b[i] 比较的结果,类似于:

[z for i, j in zip(a, b)  z = i == j] # (just with the right syntax)

z 将是 1 如果在某个地方 i == j,所以我可以检查数组是否有任何“真”值。

【问题讨论】:

  • 请提一下你用python试过什么?一些代码会很方便!
  • 请在每个帖子中保留 一个 问题。使用sets 回答您的第一个问题。您的第二个几乎就在那里:[i == j for i, j in zip(a, b)],但这将限于两个列表中最短的长度。例如。它会返回[False, False]

标签: python list


【解决方案1】:

你可以使用any:

any(x in a for x in b)

这个生成器表达式的好处是any 将在生成器生成True 时立即返回True,即不会有多余的x in a 查找。

编辑:

您可以通过从a 制作一个集合来提高时间复杂度。

a_set = set(a)
any(x in a_set for x in b)

关于你的新问题:

[x == y for x,y in zip(a,b)]

【讨论】:

  • any 函数的实际语法是什么?我尝试将其用作return any(x in a for x in b);,但它从任务')'、标识符和分号返回。
  • @Bobys any 接受一个迭代并检查该迭代的任何元素是否为真(即bool(element) == True)。您的语句在语法上是正确的(可迭代是生成器表达式),因此您得到的错误必须来自其他地方。
【解决方案2】:

优雅的方式是使用集合:

a = ["mail1", "mail2", "mail3", "mail4"]
b = ["mail2", "mail5"]

anb = set(a) & set(b)

print anb

if anb:
    print True

>>> set(['mail2'])
>>> True

【讨论】:

  • 从非平凡列表(在大多数情况下)构建两个集合肯定比在 any 中运行 genexp 需要更长的时间
  • 当然可以,这只是一种获得差异并进行检查的聪明方法。只是想展示一下,因为太多人不知道套装有多棒。
【解决方案3】:

any 函数接受一个可迭代的(See documentation here),所以答案应该是any([x in a for x in b])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多