【问题标题】:Flatten nested lists when list contains 1 single item which is another list当列表包含另一个列表的 1 个单个项目时,展平嵌套列表
【发布时间】: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'] 之类的东西,它不应该被展平,这是一个非常精确的情况。

标签: python list nested flatten


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-13
      • 2013-12-15
      • 2020-10-19
      • 2022-07-20
      • 2014-03-25
      相关资源
      最近更新 更多