单线程来检查列表中是否至less有一个项目存在于另一个列表中?

可以说我有一个列表a=[1,2,3]我想知道是否至less有一个数字存在于另一个列表中,像这样: 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 

但是有没有办法把这个东西整理一下呢?

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

 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选出a更大的集合可能会更快)。

编辑: isdisjoint比Python 2.6及更高版本的intersection要好,正如下面的各个人所指出的那样。 很高兴了解这一点。 🙂

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) 

这是一个问题,而不是一个列表问题。 有了正确的数据types,答案往往是显而易见的:-)

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

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

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

这应该工作。

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