单线程来检查列表中是否至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
,从a
和b
选出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])