当列表包含另一个列表的 1 个单个项目时,展平嵌套列表

Posted

技术标签:

【中文标题】当列表包含另一个列表的 1 个单个项目时,展平嵌套列表【英文标题】:Flatten nested lists when list contains 1 single item which is another list 【发布时间】:2019-05-07 14:35:40 【问题描述】:

基本上,我正在尝试查看当列表包含 1 个单个项目(另一个列表)时是否可以展平嵌套列表。以这个数据结构为例:

[['a', 'b', 'c', [['d', 'e', 'f']]]]

理想的数据格式是:

['a', 'b', 'c', ['d', 'e', 'f']]

这种嵌套可以深入到任意数量的级别,但只需要展平单个列表数据。有人知道这样做的方法吗?我在 SO 上得到的最接近的答案是:Flattening a list recursively 但这完全使整个列表变平。

【问题讨论】:

那么如果嵌套列表有两个以上的元素你不想展平它? 不,这是摄取数据的产物。如果它是 [['a', 'b', 'c'], 'd'] 之类的东西,它不应该被展平,这是一个非常精确的情况。 【参考方案1】:

您可以使用递归函数专门测试给定列表中是否只有一项,以及该项是否为列表,如果是,则跳过生成该列表:

def simplify(l):
    if len(l) == 1 and isinstance(l[0], list):
        yield from simplify(l[0])
    else:
        for i in l:
            yield list(simplify(i)) if isinstance(i, list) else i

这样:

list(simplify([['a', 'b', 'c', [['d', 'e', 'f']]]]))

返回:

['a', 'b', 'c', ['d', 'e', 'f']]

【讨论】:

【参考方案2】:

递归函数可以做到这一点:

def flatten(l: list):
    if len(l) == 1:
        if isinstance(l[0], list):
            l = l[0]
    for i, elem in enumerate(l):
        if isinstance(type(elem), list):
            l[i] = flatten(elem)
    return l

【讨论】:

以上是关于当列表包含另一个列表的 1 个单个项目时,展平嵌套列表的主要内容,如果未能解决你的问题,请参考以下文章

Python:如何展平每个子列表是一个包含单个浮点数的列表列表[关闭]

Listview的项目位置0持有另一个列表视图,其中包含10个项目,每个项目打开单个活动但不同的文本数据

以独特的方式展平包含嵌套字典的列表的数据框列

将嵌套列表展平为 1 深列表

在python中展平嵌套字符串列表

Listview 的项目位置 0 持有另一个包含 10 个项目的列表视图,每个项目打开单个活动但不同的文本数据