【问题标题】:Python flatten list (but not all the way)Python展平列表(但不是一直)
【发布时间】:2013-11-06 04:40:11
【问题描述】:

我有一个列表列表...

A = [ [[1,3]], [[3,5], [4,4], [[5,3]]] ]

以下函数输出[1, 3, 3, 5, 4, 4, 5, 3]

def flatten(a):
    b = []
    for c in a:
        if isinstance(c, list):
            b.extend(flatten(c))
        else:
            b.append(c)
    return b

但是,我想在最后一级停止展平,以便获得[ [1,3], [3,5], [4,4], [5,3] ]

【问题讨论】:

  • 这需要扫描列表以查看是否没有包含列表。
  • @MartijnPieters 是的,我明白了上述内容,但问题是最后一个元素是列表中的列表。
  • @GamesBrainiac:看我的回答;只是在展平之前测试列表。
  • @MartijnPieters 我通过列表理解做到了这一点。但你的是通用的:)
  • 您可以使用缺少的post 来检查列表中是否包含列表,然后再进行递归。

标签: python list flatten


【解决方案1】:

您可以在展平之前测试包含的列表:

def flatten(a):
    b = []
    for c in a:
        if isinstance(c, list) and any(isinstance(i, list) for i in c):
            b.extend(flatten(c))
        else:
            b.append(c)
    return b

演示:

>>> def flatten(a):
...     b = []
...     for c in a:
...         if isinstance(c, list) and any(isinstance(i, list) for i in c):
...             b.extend(flatten(c))
...         else:
...             b.append(c)
...     return b
... 
>>> A = [ [[1,3]], [[3,5], [4,4], [[5,3]]] ]
>>> flatten(A)
[[1, 3], [3, 5], [4, 4], [5, 3]]

这试图在这种情况下尽可能高效; any() 只需要测试直到找到一个列表,而不是所有元素。

【讨论】:

  • 做得很好,最后我也做了同样的事情,但我使用了chain.from_iterable
【解决方案2】:
A = [ [[1,3]], [[3,5], [4,4], [[5,3]]] ]

print [child[0] if isinstance(child[0], list) else child for item in A for child in item]

输出

[[1, 3], [3, 5], [4, 4], [5, 3]]

注意:此解决方案仅针对此问题。这不是通用的列表扁平化解决方案。

同样的想法,itertools.chain

from itertools import chain
print [item[0] if isinstance(child[0], list) else item for item in chain(*A)]

输出

[[1, 3], [3, 5], [4, 4], [5, 3]]

【讨论】:

  • 使用isinstance() 来测试类型; type(...) == typeobj 非常严格。即使isinstance() 不可用,您也应该使用is typeobj
  • @MartijnPieters 为什么有限制?你能解释一下吗?
  • isinstance(ob, list) 对于子类也是 Truetype(ob) is list 只允许列表对象,不允许子类。
  • @MartijnPieters 哦。谢谢。更新:) 没有一天没有从你那里学到东西。非常感谢:)
猜你喜欢
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
  • 1970-01-01
  • 2012-11-19
  • 2018-07-19
  • 2019-11-04
  • 2012-04-25
相关资源
最近更新 更多