使用递归删除列表元素

时间:2020-10-03 01:57:27

标签: python list recursion reverse

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

1 个答案:

答案 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]