展开并展平一个参差不齐的嵌套列表

ilp*_*ipe 4 python nested-lists

我知道之前已经详细介绍了扁平化嵌套列表的主题,但我认为我的任务有点不同,我找不到任何信息.

我正在写一个刮刀,作为输出我得到一个嵌套列表.顶级列表元素应该成为电子表格形式的数据行.但是,由于嵌套列表通常具有不同的长度,因此我需要在展平列表之前展开它们.

这是一个例子.我有

   [ [ "id1", [["x", "y", "z"], [1, 2]],    ["a", "b", "c"]],
     [ "id2", [["x", "y", "z"], [1, 2, 3]], ["a", "b"]],
     [ "id3", [["x", "y"],      [1, 2, 3]], ["a", "b", "c", ""]] ]
Run Code Online (Sandbox Code Playgroud)

我最终想要的输出是

   [[ "id1", "x", "y",  z, 1, 2, "", "a", "b", "c", ""],
    [ "id2", "x", "y",  z, 1, 2,  3, "a", "b",  "", ""],
    [ "id3", "x", "y", "", 1, 2,  3, "a", "b", "c", ""]]
Run Code Online (Sandbox Code Playgroud)

但是,像这样的中间列表

   [ [ "id1", [["x", "y", "z"], [1, 2, ""]], ["a", "b", "c", ""]],
     [ "id2", [["x", "y", "z"], [1, 2,  3]], ["a", "b",  "", ""]],
     [ "id3", [["x", "y",  ""], [1, 2,  3]], ["a", "b", "c", ""]] ]
Run Code Online (Sandbox Code Playgroud)

然后,我可以简单地扁平化也没关系.

顶级列表元素(行)在每次迭代中构建,并附加到完整列表.我想在最后转换完整列表更容易?

元素嵌套的结构应该是相同的,但是我现在还不能确定它.如果结构看起来像这样,我想我有问题.

   [ [ "id1", [[x, y, z], [1, 2]],             ["a", "b", "c"]],
     [ "id2", [[x, y, z], [1, 2, 3]], ["bla"], ["a", "b"]],
     [ "id3", [[x, y],    [1, 2, 3]],          ["a", "b", "c", ""]] ]
Run Code Online (Sandbox Code Playgroud)

哪个应该成为

   [[ "id1", x, y,  z, 1, 2, "",    "", "a", "b", "c", ""],
    [ "id2", x, y,  z, 1, 2,  3, "bla", "a", "b",  "", ""],
    [ "id3", x, y, "", 1, 2,  3,    "", "a", "b", "c", ""]]
Run Code Online (Sandbox Code Playgroud)

感谢您提出任何意见,请原谅,如果这是微不足道的,我对Python很新.

Blc*_*ght 6

我有一个简单的解决方案,用于"相同结构"的情况,使用递归生成器和izip_longest函数itertools.这段代码适用于Python 2,但通过一些调整(在注释中注明),它可以在Python 3上运行:

from itertools import izip_longest # in py3, this is renamed zip_longest

def flatten(nested_list):
    return zip(*_flattengen(nested_list)) # in py3, wrap this in list()

def _flattengen(iterable):
    for element in izip_longest(*iterable, fillvalue=""):
        if isinstance(element[0], list):
            for e in _flattengen(element):
                yield e
        else:
            yield element
Run Code Online (Sandbox Code Playgroud)

在Python 3.3,将变得更加简单,这要归功于PEP 380,这将允许递归步骤,for e in _flatengen(element): yield e以成为yield from _flattengen(element).