使用递归删除列表元素



这是我的课堂问题:•deepReverse(L(将元素列表作为输入,其中一些元素可能是列表他们自己deepReverse返回列表的反转,其中列表也是deepReversed。以下是一些例子:

deepReverse([1, 2, 3])
[3, 2, 1]
deepReverse([1, [2, 3], 4])
[4, [3, 2], 1]
deepReverse([1, [2, [3, 4], [5, [6, 7], 8]]])
[[[8, [7, 6], 5], [4, 3], 2], 1]

对于这个问题,您需要能够测试列表中的元素是否是列表本身。对此最后,您可以使用以下代码行来测试x是否是列表:

if isinstance(x, list):
if True you will end up here
else:
if False you will end up here

这是我目前掌握的代码:

def deepReverse(L):
if L == []:
return []
elif isinstance(L[0], list):
if True:
list2 = L[0]
return deepReverse(list2[1:]) + [list2[0]]
else:
deepReverse(L[1:]) + deepReverse(L[0])
else:
return deepReverse(L[1:]) + [L[0]]

由于某种原因,当我使用最后一个测试用例时,它一直返回[4,3,2,1]。我不明白为什么当我运行调试器时,当它到达[3,4],遍历每个第一个元素时,它只会擦除第二个元素。我们也不允许使用任何内置函数,必须使用递归。请帮忙!

假设您不能依赖reversed-

def deep_rev(t):
if isinstance(t, list):
if not t:
return []
else:
return [ *deep_rev(t[1:]), deep_rev(t[0]) ]
else:
return t

print(deep_rev([1, [2, [3, 4], [5, [6, 7], 8]]]))
# [[[8, [7, 6], 5], [4, 3], 2], 1]

如果你愿意的话,你可以用*-拆包来交换列表连接,+-

def deep_rev(t):
if isinstance(t, list):
if not t:
return []
else:
return deep_rev(t[1:]) + [ deep_rev(t[0]) ]
else:
return t

print(deep_rev([1, [2, [3, 4], [5, [6, 7], 8]]]))
# [[[8, [7, 6], 5], [4, 3], 2], 1]

上面的两个程序依赖于列表切片t[1:],以使用较小的列表进行重复。对每个迭代的列表进行切片会创建许多中间值,我们可以使用不同的技术((来避免这些中间值

def deep_rev(t, k = 0):
try:
if isinstance(t, list):
v = t[k]
return deep_rev(t, k + 1) + [ deep_rev(v) ]
else:
return t
except IndexError:
return []

print(deep_rev([1, [2, [3, 4], [5, [6, 7], 8]]]))
# [[[8, [7, 6], 5], [4, 3], 2], 1]

最新更新