这是我上课的问题: •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]遍历每个第一个元素时,为什么会擦除第二个元素。我们也不允许使用任何内置函数,而必须使用递归。请帮忙!
答案 0 :(得分:0)
假设您不能依靠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]