检查项目是否在嵌套列表中

Al_*_*der 14 python list

在检查后的简单列表中是微不足道的:

x = [1, 2, 3]

2 in x  -> True
Run Code Online (Sandbox Code Playgroud)

但如果是列表清单,例如:

x = [[1, 2, 3], [2, 3, 4]]

2 in x   -> False
Run Code Online (Sandbox Code Playgroud)

如何才能回归True

Ósc*_*pez 17

试试这个,使用内置any功能.这是最惯用的解决方案,它也很有效,因为any短路并在找到第一个匹配时立即停止:

x = [[1, 2, 3], [2, 3, 4]]
any(2 in sl for sl in x)
=> True
Run Code Online (Sandbox Code Playgroud)


Cur*_* F. 9

这是一个适用于任何嵌套级别的递归版本.

def in_nested_list(my_list, item):
    """
    Determines if an item is in my_list, even if nested in a lower-level list.
    """
    if item in my_list:
        return True
    else:
        return any(in_nested_list(sublist, item) for sublist in my_list if isinstance(sublist, list))
Run Code Online (Sandbox Code Playgroud)

以下是一些测试:

x = [1, 3, [1, 2, 3], [2, 3, 4], [3, 4, [], [2, 3, 'a']]]
print in_nested_list(x, 2)
print in_nested_list(x, 5)
print in_nested_list(x, 'a')
print in_nested_list(x, 'b')
print in_nested_list(x, [])
print in_nested_list(x, [1, 2])
print in_nested_list(x, [1, 2, 3])

True
False
True
False
True
False
True
Run Code Online (Sandbox Code Playgroud)


Kas*_*mvd 5

您可以使用set.issubset()itertools.chain()

In [55]: x = [[1, 2, 3], [2, 3, 4]]

In [56]: {4}.issubset(chain.from_iterable(x))
Out[56]: True

In [57]: {10}.issubset(chain.from_iterable(x))
Out[57]: False
Run Code Online (Sandbox Code Playgroud)

您还可以有效地检查多个项目的成员资格:

In [70]: {2, 4}.issubset(chain.from_iterable(x))
Out[70]: True

In [71]: {2, 4, 10}.issubset(chain.from_iterable(x))
Out[71]: False
Run Code Online (Sandbox Code Playgroud)