假设我有一个列表 a=[1,2,3]
我想知道其中至少有一个数字存在于另一个列表中,例如: 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
但是有没有办法把它放在一行中使事情变得整洁?
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
比Python 2.6及更高版本的intersection
更好,正如下面的各种人所指出的那样。很高兴得知这一点。:)
这是一个集合问题,而不是列表问题。 使用正确的数据类型,答案通常是显而易见的:-(
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])