我有一个 Python 列表。如下图所示,我想检查其中一个子列表是否包含项目。以下尝试失败。有谁知道一种简单的方法——不用我自己编写 for 循环?
>>> a = [[1,2],[3,4],[5,6],7,8,9]
>>> 2 in a
我希望,True
但回报是False
>>> a = [[1,2],[3,4],[5,6],7,8,9]
>>> any(2 in i for i in a)
True
对于包含一些列表和一些整数i
的列表,在测试搜索目标是否在i
.
>>> any(2 in i for i in a if isinstance(i, list))
True
>>> any(8 in i for i in a if isinstance(i, list))
False
如果你不检查是否i
是一个列表,那么你会得到一个类似下面的错误。接受的答案是错误的,因为它给出了这个错误。
>>> any(8 in i for i in a)
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
any(8 in i for i in a)
File "<pyshell#3>", line 1, in <genexpr>
any(8 in i for i in a)
TypeError: argument of type 'int' is not iterable
我认为没有某种循环就没有任何方法可以进行测试。
这是一个使用简单for
循环显式检查子列表中的对象的函数:
def sublist_contains(lst, obj):
for item in lst:
try:
if obj in item:
return True
except TypeError:
pass
return False
当然,这并不能测试对象是否在顶级列表中,如果有多个嵌套级别,它也不会起作用。这是一个使用递归的更通用的解决方案,它将循环放在传递给内置函数的生成器表达式中any
:
def nested_contains(lst, obj):
return any(item == obj or
isinstance(item, list) and nested_contains(item, obj)
for item in lst)
简单的方法是:
a = [[1,2],[3,4],[5,6],7,8,9]
result = [2 in i for i in a]
True in result --> True