单行检查列表中是否至少存在一个项目存在于另一个列表中



假设我有一个列表 a=[1,2,3]我想知道其中至少有一个数字存在于另一个列表中,例如: b=[4,5,6,7,8,1]换句话说,我想知道列表 b 中是否存在 1、2 或 3 个。我现在我可以做类似的事情

def func(a, b):
    for i in a:
       if i in b:
          return True
    return False

但是有没有办法把它放在一行中使事情变得整洁?

Python 2.6 及更高版本:

def func(a, b):
  return not set(a).isdisjoint(b)

对于 2.4 或 2.5:

def func(a, b):
  return len(set(a).intersection(b)) != 0

对于 2.3 及更低版本:

sudo apt-get update
sudo apt-get upgrade

;)

一个简单的单行代码是:

any(i in b for i in a)

有很多方法可以做到这一点。最直接的翻译是:

any_in = lambda a, b: any(i in b for i in a)

您还可以使用涉及集合的各种内容,例如:

any_in = lambda a, b: bool(set(a).intersection(b))

(这取决于a的元素是可哈希的,但如果这是真的,那么为这两种方法中的任何一种制作一组更大的ab可能会更快(。

编辑:isdisjoint比Python 2.6及更高版本的intersection更好,正如下面的各种人所指出的那样。很高兴得知这一点。:)

这是一个集合问题,而不是列表问题。 使用正确的数据类型,答案通常是显而易见的:-(

def func(a, b):
    return not set(a).isdisjoint(b)

通过将列表转换为集合,可以对它们执行集合操作。如果交集大于 0,则至少有一个元素匹配:

len(set(a) & set(b)) > 0

这应该有效。

def func(a, b):
    return any([i in b for i in a])

最新更新