首页 > 解决方案 > 如何在 Python 中“堆叠”嵌套列表?

问题描述

如何重塑嵌套列表,以便所有嵌套项目都嵌套在之前的项目中?

例如

ex1 = [1, [2, 20], [3, 30], [4]]
ex2 = [1, [2]]
ex3 = [1]

预期的输出将是这样的:

ex1 = [1, [2, 20, [3, 30, [4]]]]
ex2 = [1, [2]]
ex3 = [1]

我想我正在寻找与扁平化列表相反的事情。

原始列表结构可以嵌套任意长度的对象,但这些嵌套对象本身永远不会包含嵌套对象。

也可能存在零个嵌套对象。

编辑:我已修复的示例中的错误(我认为)

编辑2:一些重要的澄清错过了,现在添加

标签: pythonlist

解决方案


只要列表长于 2,大概它会包含我们需要堆叠的子列表,所以弹出最后一个并堆叠它。

def stack(L):
    """Note: Mutates L"""
    while len(L) > 2:
        last = L.pop()
        L[-1].append(last)
>>> stack(ex1)
>>> ex1
[1, [2, 20, [3, 30, [4]]]]
>>> stack(ex2)
>>> ex2
[1, [2]]
>>> stack(ex3)
>>> ex3
[1]

原始解决方案 - 更复杂

沿着列表向后迭代,将每个子列表附加到它之前的子列表,然后将其从顶级列表中删除。虽然,如果顶级列表的元素少于 3 个,它可能已经是正确的。

def stack(L):
    """Note: Mutates L"""
    if len(L) < 3:
        return

    prev = L[-1]  # For use in loop
    for sublist in L[-2:0:-1]:  # Backwards from second-last to second
        sublist.append(prev)
        del L[-1]
        prev = sublist  # For next iteration

推荐阅读