Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python扁平化列表(但不是全部)_Python_List_Flatten - Fatal编程技术网

Python扁平化列表(但不是全部)

Python扁平化列表(但不是全部),python,list,flatten,Python,List,Flatten,我有一个列表列表列表 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 但是,我想在最后一级停止展

我有一个列表列表列表

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]]

您可以测试包含的列表:

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
演示:


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

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

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]]] ]

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

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

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]]
输出

[[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]]

这需要扫描列表以查看是否包含任何列表。@MartijnPieters是的,我得到了上面的内容,但问题是最后一个元素是列表中的列表。@GamesBrainiac:查看我的答案;在展平之前只需测试列表。@MartijnPieters我是通过列表理解来完成的。但是你的是泛型:)你可以使用这个,这是缺少的部分,在进行递归之前检查列表中是否有列表。这需要扫描列表以查看是否包含列表。@MartijnPieters是的,我得到了上面的内容,但问题是最后一个元素是列表中的列表。@GamesBrainiac:看到我的答案了吗;在展平之前只需测试列表。@MartijnPieters我是通过列表理解来完成的。但是你的是泛型的:)你可以使用这个,这是缺少的部分,在进行递归之前检查列表中是否有列表。做得漂亮,最后我做了同样的事情,但我使用了
chain.from iterable
。做得漂亮,最后我做了同样的事情,但我使用了
chain.from iterable
。使用
isinstance()
测试类型<代码>类型(…)==typeobj非常严格。即使
isinstance()
不可用,您也应该使用
is-typeobj
。@MartijnPieters为什么限制?你能解释一下吗?
isinstance(ob,list)
is
True
对于子类也是如此,
type(ob)is list
只允许列表对象,而不允许子类。@MartijnPieters噢。谢谢更新:)没有一天不向你学习的。非常感谢:)使用
isinstance()
测试类型<代码>类型(…)==typeobj非常严格。即使
isinstance()
不可用,您也应该使用
is-typeobj
。@MartijnPieters为什么限制?你能解释一下吗?
isinstance(ob,list)
is
True
对于子类也是如此,
type(ob)is list
只允许列表对象,而不允许子类。@MartijnPieters噢。谢谢更新:)没有一天不向你学习的。非常感谢:)