Python:检查嵌套列表是否在嵌套列表中

Say*_*shi 3 python list nested-lists

很抱歉这个可能很愚蠢的问题.但这似乎是一个难以解决的问题,我无法找到答案.

假设我在python中有以下混合嵌套列表:

a = [((1,1),(0,0)), (3,4)]
Run Code Online (Sandbox Code Playgroud)

我想检查以下元组b,cd出现在a:

b = (1,1)
c = (0,0)
d = (3,4)

print(b in a)  # <- False ?
print(c in a)  # <- False ?
print(d in a)  # <- True
Run Code Online (Sandbox Code Playgroud)

我想替换每个print语句中的代码,以便搜索在列表中找到元组,并因此返回 True

任何帮助都将非常感激.如果之前已经提出这个问题,请道歉.

jua*_*aga 6

该列表有两个元素,一个包含其他元组的元组和一个int元组.如果要检查嵌套结构,则必须自己执行此操作.如果嵌套可以任意深度,那么递归解决方案(这个假设嵌套容器只能是元组或列表)将是一个选项:

>>> a = [((1,1),(0,0)), (3,4)]
>>> def is_in(x, nested):
...     result = False
...     if not isinstance(nested, (tuple, list)):
...         return result
...     for item in nested:
...         if x == item:
...             result = True
...         else:
...             result = result or is_in(x, item)
...         if result:
...             return True
...     return result
...
>>> is_in((1,1), a)
True
>>> is_in((0,0), a)
True
>>> is_in((3,4), a)
True
>>> is_in((8, 8), a)
False
>
Run Code Online (Sandbox Code Playgroud)

一旦找到第一个匹配项,这应该停止遍历.

注意,如果递归不是你的事,你可以用自己的堆栈替换调用堆栈!

def is_in_iterative(x, nested):
    stack = [nested]
    while stack:
        item = stack.pop()
        print(item)
        if item == x:
            return True
        elif isinstance(item, (list, tuple)):
            stack.extend(item)
    return False
Run Code Online (Sandbox Code Playgroud)

但请注意,这将以相反的顺序检查...


Joe*_*don 6

我们需要一个递归函数,它接受一个列表或元组以及一个要查找的元素.

每个函数都应该使用in运算符检查元素是否在当前可迭代中.如果它然后返回True,否则检查它是否在任何较低维度中通过递归调用每个较低的iterables并返回其中任何一个成功(这可以用a完成for-loop,但我们也可以使用any()功能).

所以一个班轮大概是:

def inc(it, e):
    return True if e in it else any(inc(iit, e) for iit in it if type(iit) in (list, tuple))
Run Code Online (Sandbox Code Playgroud)

它按预期工作:

>>> inc(a, (1,1))
True
>>> inc(a, (0,0))
True
>>> inc(a, (3,4))
True
Run Code Online (Sandbox Code Playgroud)