大多数答案仅适用于这种特定形状的嵌套列表,但也可以创建一个适用于任何形状的嵌套列表的解决方案。
def flatten_from(sequence, path=[]):
start = path.pop(0) if path else 0
for item in sequence[start:]:
if isinstance(item, (list, tuple)):
yield from flatten_from(item, path)
else:
yield item
用问题中的例子
>>> list(flatten_from([[1, 2, 3], [4, 5, 10], [6, 2, 1]], [0, 2]))
[3, 4, 5, 10, 6, 2, 1]
它也适用于输入数据的任何形状和嵌套级别
m = [[1], [[2], [3, 4, 5, 6, 7]], 8, [9, [10, 11]]]
flatten_from(m, [])) # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
flatten_from(m, [2]) # 8, 9, 10, 11
flatten_from(m, [1, 1, 3]) # 6, 7, 8, 9, 10, 11
不过,这有点像个混蛋算法。一方面,它使用了很好的函数式编程概念:递归和产量。
另一方面,它依赖于使用list.pop 改变路径参数的副作用,因此它不是一个纯函数。