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)
isTrue
对于子类也是如此,type(ob)is list
只允许列表对象,而不允许子类。@MartijnPieters噢。谢谢更新:)没有一天不向你学习的。非常感谢:)使用isinstance()
测试类型<代码>类型(…)==typeobj非常严格。即使isinstance()
不可用,您也应该使用is-typeobj
。@MartijnPieters为什么限制?你能解释一下吗?isinstance(ob,list)
isTrue
对于子类也是如此,type(ob)is list
只允许列表对象,而不允许子类。@MartijnPieters噢。谢谢更新:)没有一天不向你学习的。非常感谢:)