假设我有一个列表
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
但是有没有办法把它放在一条线上让事情变得整洁?
假设我有一个列表
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
但是有没有办法把它放在一条线上让事情变得整洁?
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
一组更大的集合可能会更快)。a
b
编辑:isdisjoint
比intersection
Python 2.6 及更高版本更好,如下面的许多人所述。很高兴了解到这一点。:)
这是一个集合问题,而不是列表问题。使用正确的数据类型,答案通常是显而易见的 :-)
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])