反转 python 中的嵌套列表

reversing a nested list in python

您好,我正在尝试以相反的顺序转换嵌套列表。

这是我的代码:

def reverse_(items):
     items =  items[::-1]
        new_l = []
        for item in items:
            if type(item) == list:
                item.reverse()
                new_l.append(item)
            else:
                new_l.append(item)
        return new_l
  1. print(reverse_reversed([1, [2, 3, 4, 'yeah'], 5] )) returns : [5, ['yeah', 4, 3, 2], 1] 这是正确的

  2. 但是 print(reverse_reversed([42, [99, [17, [33, ['boo!']]]]]) returns : [[[17, [33, ['boo!']]], 99], 42] 应该是这样的: [[[[['boo!'], 33], 17], 99], 42]

您似乎想要递归地反转列表,而不仅仅是嵌套一次。这意味着您需要进行递归函数调用,即它需要调用自身。

def recursive_reversed(items):
    if isinstance(items, list):
        return [recursive_reversed(item) for item in reversed(items)]
    return items

备注:

  1. 我使用 isinstance 检查而不是 type(item) ==。这通常是您想要的,这意味着 list 的子类也将被反转(尽管它们将是常规列表)。
  2. 没有制作额外的副本:reversed 以相反的顺序遍历原始列表。
  3. 没有原地反转:如果您在调用您的实现后查看原始列表的内容,您会看到它的子列表也将被反转。
  4. 我使用了列表理解,它通常优于“创建一个空列表,循环其他内容,每次迭代向该列表附加内容”。
  5. 我的函数调用自身作为一种分而治之的形式。

因为你做了items[::-1],所以列表会变成这样 [[99, [17, [33, ['boo!']]]], 42] 正如您在列表中看到的,只有两项 [99, [17, [33, ['boo!']]]]42。所以你 new 如果列表中有更多列表,你将必须检查你是否正在迭代列表中没有未反转的列表。但是你不能用一个简单的 for 循环来做到这一点。

如果您实际上不需要反转副本而只想反转结构本身:

def reverse(items):
    if isinstance(items, list):
        items.reverse()
        for item in items:
            reverse(item)

演示:

>>> a = [42, [99, [17, [33, ['boo!']]]]]
>>> reverse(a)
>>> a
[[[[['boo!'], 33], 17], 99], 42]

你也可以用 return items 结束它以获得结果 returned:

>>> reverse([42, [99, [17, [33, ['boo!']]]]])
[[[[['boo!'], 33], 17], 99], 42]

虽然同时修改和 return 有点不寻常,但有些人不会喜欢它。