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

48 python

让我说我有一个列表 a=[1,2,3] 我想知道其中至少有一个数字是否存在于另一个列表中,如下所示: b=[4,5,6,7,8,1] 换句话说,我想知道列表中是否存在1,2或3 b.我现在可以做点什么了

def func(a, b):
    for i in a:
       if i in b:
          return True
    return False
Run Code Online (Sandbox Code Playgroud)

但有可能有办法把它放在一条线上以使事情变得整洁吗?

Tho*_*mas 65

Python 2.6及以上版本:

def func(a, b):
  return not set(a).isdisjoint(b)
Run Code Online (Sandbox Code Playgroud)

对于2.4或2.5:

def func(a, b):
  return len(set(a).intersection(b)) != 0
Run Code Online (Sandbox Code Playgroud)

2.3及以下:

sudo apt-get update
sudo apt-get upgrade
Run Code Online (Sandbox Code Playgroud)

;)

  • 支持2.3及以下.这很有趣:D ......但是正确答案 (14认同)
  • 为LOL投票 (5认同)
  • 可能是时候将 2.3 建议更新为“2.6 及以下”​​甚至“3.4 及以下” (2认同)

Dou*_*gal 57

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

any_in = lambda a, b: any(i in b for i in a)
Run Code Online (Sandbox Code Playgroud)

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

any_in = lambda a, b: bool(set(a).intersection(b))
Run Code Online (Sandbox Code Playgroud)

(这取决于a可以清洗的元素,但是如果这是真的,那么制作一组较大的a并且b对于这些方法中的任何一种方法可能会更快).

编辑:isdisjointintersectionPython 2.6及更高版本更好,正如以下各方所指出的那样.很高兴了解这一点.:)


mat*_*ata 50

一个简单的单行将是:

any(i in b for i in a)
Run Code Online (Sandbox Code Playgroud)

  • 最好的pythonic解决方案 (4认同)

Ray*_*ger 14

这是一个集合问题,而不是列表问题.使用正确的数据类型,答案通常很明显:-)

def func(a, b):
    return not set(a).isdisjoint(b)
Run Code Online (Sandbox Code Playgroud)


Mae*_*ler 5

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

len(set(a) & set(b)) > 0
Run Code Online (Sandbox Code Playgroud)


rab*_*bit 5

这应该工作。

def func(a, b):
    return any([i in b for i in a])
Run Code Online (Sandbox Code Playgroud)