62

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

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

但是有没有办法把它放在一条线上让事情变得整洁?

4

6 回答 6

77

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

;)

于 2012-05-19T19:40:14.707 回答
70

一个简单的单线将是:

any(i in b for i in a)
于 2012-05-19T19:39:30.760 回答
63

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

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

编辑:isdisjointintersectionPython 2.6 及更高版本更好,如下面的许多人所述。很高兴了解到这一点。:)

于 2012-05-19T19:39:23.443 回答
17

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

def func(a, b):
    return not set(a).isdisjoint(b)
于 2012-05-19T19:43:46.540 回答
6

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

len(set(a) & set(b)) > 0
于 2012-05-19T19:39:40.360 回答
5

这应该有效。

def func(a, b):
    return any([i in b for i in a])
于 2012-05-19T19:40:04.783 回答