Python:检查嵌套列表是否在另一个嵌套列表中。

3

对于可能有些愚蠢的问题我表示抱歉。但这似乎是一个棘手的问题,我找不到答案。

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

a = [((1,1),(0,0)), (3,4)]

我想检查以下元组bcd是否出现在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

我希望替换每个打印语句中的代码,以便搜索在列表中找到元组并返回True

非常感谢您提供任何帮助。如果此问题以前已经被问过,请原谅。


3
嵌套的深度是任意的吗?还是最多只有2级? - Ma0
5
你的例子中使用了一个嵌套元组列表,而不是嵌套列表。 - Drako
他们是正确的,因为在a中没有(1,1),在a中有一个元组((1,1),(0,0))。 - Drako
你可以使用以下代码:for element in a,检查是否 x 在 element 中,以获取你的情况的 True 值(但是如 @Ev.Kounis 所要求的-必须考虑深度)。 - Drako
你必须自己实现它。Python 中没有内置函数来完成这个功能。那么,你在实现它时遇到了困难吗?(如果有的话,是什么困难?) - user202729
显示剩余3条评论
3个回答

6
  • 这个列表有两个元素,一个包含其他元组的元组和一个整数元组。
  • 如果你想检查嵌套结构,你需要自己去做。
  • 如果嵌套可以任意深,那么递归解决方案(此方案假设嵌套容器只能是元组或列表)将是一种选择:
>>> 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
>

应该在找到第一个匹配项后停止遍历。

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

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

然而,请注意这将按相反的顺序检查...

递归绝对是解决这个问题的好方法。虽然逻辑可以写得更简短: def is_in(x, nested): if not isinstance(nested, (tuple, list)): return False if x in nested: return True for item in nested: return is_in(x, item) return False - Lukisn
@Lukisn 我很确定这不会检查整个子列表,因为你在for循环的第一次迭代中返回,但是如果没有缩进,我无法确定你的确切意思。所以考虑 a = [((1, 1), (0, 0)), (3, 4), ((8, 8), 10)]is_in((8,8), a) - juanpa.arrivillaga

6
我们需要一个递归函数,它接受一个列表或元组和要查找的元素。
每个函数应该使用“in”运算符检查当前可迭代对象中是否存在该元素。如果存在,则返回“True”,否则通过递归调用自身检查是否存在于任何较低维度中,并返回其中任何一个成功的结果(这可以使用“for循环”完成,但我们也可以使用“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))

它按照预期工作:

>>> inc(a, (1,1))
True
>>> inc(a, (0,0))
True
>>> inc(a, (3,4))
True

1
我喜欢使用 any,但我认为使用条件表达式会使它有点笨重,我会只使用 if: ... else:... 并保留你的 any。不过你应该一定要使用 isinstance... - juanpa.arrivillaga

0

我尝试通过递归函数方法和全局变量定义来解决您的问题,希望这个解决方案能给您一些启示:

a = [((1,1),(0,0)), (3,4)]
global bb
bb=False

def checker(tuple1, tuple2):
    b=str(type(('a','b')))
    for i in range(len(tuple1)):
        if(str(type(tuple1[i]))!=b):
            if (tuple1==tuple2):
                global bb
                bb=True


        else:
            checker(tuple1[i],tuple2)

checker(a,(1,1))
print(bb)
#-->True

bb=False
checker(a,(3,4))
print(bb)
#-->True

bb=False
checker(a,(0,0))
print(bb)
#--->True

bb=False
checker(a,(10,1))
print(bb)
#--->False

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接