最近看30-seconds-of-python-code, 发现一个展开列表的例子, 想了很久, 在这里记录一下心得(PS: 代码均在Python3.6上测试)。
首先我想到的是递归列表推导,然后代码写出来是这样子的
def flatten(arr):
if isinstance(arr, list):
return [a for i in arr for a in flatten(i)]
else:
return [arr]
然后看了GitHub的代码, 在这里粘贴出来
def spread(arg):
ret = []
for i in arg:
if isinstance(i, list):
ret.extend(i)
else:
ret.append(i)
return ret
def deep_flatten(arr):
result = []
result.extend(
spread(list(map(lambda x: deep_flatten(x) if type(x) == list else x, arr))))
return result
然后想到了yield, 便开始思考能否用它来写
def flatten(arr):
for a in arr:
if isinstance(a, list):
yield from flatten(a)
else:
yield a
# 这里用到了Python3中的yield from.
# Python2可以这样写, 实际上是一样的
def flatten(arr):
for a in arr:
if isinstance(a, list):
for sub in flateen(a):
yield sub
else:
yield a
大神们有好的方案, 欢迎留言.