Python: 检查嵌套列表是否在嵌套列表中
Python: Check if a nested list is in a nested list
对于这个可能很愚蠢的问题,我们深表歉意。但这似乎是一个难解的问题,我就是找不到答案。
假设我在 python 中有以下混合嵌套列表:
a = [((1,1),(0,0)), (3,4)]
我想检查以下元组 b
、c
和 d
是否出现在 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
我想替换每个打印语句中的代码,以便搜索在列表中找到元组,因此 returns True
任何帮助都将不胜感激。如果之前已经有人问过这个问题,我们深表歉意。
列表有两个元素,一个包含其他元组的元组和一个整数元组。如果你想检查嵌套结构,你将不得不自己做。如果嵌套可以是任意深度:
,则递归解决方案(假设嵌套容器只能是元组或列表)将是一种选择
>>> 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
但是,请注意,这将检查 反向 顺序...
我们需要一个递归函数,它接受一个列表或元组和一个要查找的元素。
每个函数都应使用 in
运算符检查元素是否在当前可迭代对象中。如果它在 return True
中,否则检查它是否在任何较低维度中,方法是用每个较低的可迭代对象递归调用自身,如果其中任何一个成功,则 return (这可以用 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))
它按预期工作:
>>> inc(a, (1,1))
True
>>> inc(a, (0,0))
True
>>> inc(a, (3,4))
True
我尝试通过递归函数方法和全局变量定义来解决你的问题,希望这个解决方案能给你思路:
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
对于这个可能很愚蠢的问题,我们深表歉意。但这似乎是一个难解的问题,我就是找不到答案。
假设我在 python 中有以下混合嵌套列表:
a = [((1,1),(0,0)), (3,4)]
我想检查以下元组 b
、c
和 d
是否出现在 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
我想替换每个打印语句中的代码,以便搜索在列表中找到元组,因此 returns True
任何帮助都将不胜感激。如果之前已经有人问过这个问题,我们深表歉意。
列表有两个元素,一个包含其他元组的元组和一个整数元组。如果你想检查嵌套结构,你将不得不自己做。如果嵌套可以是任意深度:
,则递归解决方案(假设嵌套容器只能是元组或列表)将是一种选择>>> 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
但是,请注意,这将检查 反向 顺序...
我们需要一个递归函数,它接受一个列表或元组和一个要查找的元素。
每个函数都应使用 in
运算符检查元素是否在当前可迭代对象中。如果它在 return True
中,否则检查它是否在任何较低维度中,方法是用每个较低的可迭代对象递归调用自身,如果其中任何一个成功,则 return (这可以用 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))
它按预期工作:
>>> inc(a, (1,1))
True
>>> inc(a, (0,0))
True
>>> inc(a, (3,4))
True
我尝试通过递归函数方法和全局变量定义来解决你的问题,希望这个解决方案能给你思路:
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