如果有一个列表嵌套列表的数据结构,形如:
[1,2,3,4,[1,2,[1,4,6,8]],7]
现在我们想把它展平:
[1, 2, 3, 4, 1, 2, 1, 4, 6, 8, 7]
通常的做法是:

利用层次递归来实现,但是这样也有缺陷:需要把储存结果的列表作为参数不停递归传入。
占用内存太大。
解决方案
可以采用生成器来解决

输出结果

besides
其中, yield from是从Python 3.3开始引入的写法:
yield from x
等价于
for g in x:
yield g
所以,当代码运行到
[x for x in solution._flat(aList))]
时,每一次循环都会进入到 flat生成器里面。在 flat里面,对传入的参数使用for循环进行迭代,如果拿到的元素不是列表,那么就直接抛出,送到上一层。如果当前已经是最上层了,那么就再一次抛出给外面的列表推导式。如果当前元素是列表,那么继续生成一个生成器,并对这个新的生成器进行迭代,并把每一个结果继续往上层抛出。
最终,每一个数字都会被一层一层往上抛出给列表推导式,从而获得需要的结果。
去掉from,运行结果如下:

显然是不对的,此外,可以吧yield from换成
for x in self._flat(element):
yield x

最终结果是一样的。
网友评论