有没有内置的方法可以检查一个列表是否包含在另一个列表中,而不需要进行任何循环?
我在 dir(list)
中查找了这个方法,但没有找到有用的东西。
取决于您所说的“包含”的含义。 可能是这样:
if set(a) <= set(b):
print("a is in b")
假设你想要确定sublist
的所有元素是否也是superlist
的元素:
all(x in superlist for x in sublist)
def contained(candidate, container):
temp = container[:]
try:
for v in candidate:
temp.remove(v)
return True
except ValueError:
return False
使用以下方式测试此功能:
>>> a = [1,1,2,3]
>>> b = [1,2,3,4,5]
>>> contained(a,b)
False
>>> a = [1,2,3]
>>> contained(a,b)
True
>>> a = [1,1,2,4,4]
>>> b = [1,1,2,2,2,3,4,4,5]
>>> contained(a,b)
True
all(elem in list1 for elem in list2)
你也可以直接用返回该列表的代码替换list1和list2
all([snack in ["banana", "apple", "lemon", "chocolate", "chips"] for snack in ["chips","chocolate"])
任何 + 列表推导式都可以转换成这个形式,以更好地理解代码
return_value = False
for snack in snacks:
if snack in groceries:
return_value = True
else:
return_value = False
sub
的调用是线性的,但<=
不可能是免费的。我有什么遗漏吗? - Etaoinset
是哈希表,因此访问其中一个对象的成本为O(1)
。在这段代码中,你需要遍历set(a)
中的所有元素(O(len(set(a)))
)并检查该元素是否在set(b)
中(O(1)
)。但是,总体成本当然不是(O(len(sublist))
),因为必须先从列表构建集合。我不确定这个成本是多少,但我认为它应该是O(len(list))
,因此总体成本为O(len(a)) + O(len(b)) + O(len(set(a)))
。 - Felix Klingsub
是set
的脑抽错误。) - Etaoina = [1,1,2,3]
且b=[1,2,3]
?你的代码认为a
包含在b
中,但实际上并不是这样。 - Adrien Plisson