我正在尝试编写一个“扁平化”列表的代码,它会获得一个包含多个数字列表的列表,并创建一个数字列表。
运行示例:
>>> flatten(1)
[1]
>>> flatten([])
[]
>>> flatten([[[1],[2,[1]]]])
[1, 2, 1]
我想以递归方式执行此操作,但由于某种原因,我的代码返回相同的列表:
def flatten(lst):
if type(lst)==int:
return [lst]
elif lst==[]:
return lst
else:
return [flatten(sub) for sub in lst]
答案 0 :(得分:0)
您的代码中存在两个问题
if type(lst)==int:
,您应该写isinstance(lst, int)
您正在重建一个未包装的列表,因此您实际上必须链接各个元素而不是包含在列表中
所以,而不是return [flatten(sub) for sub in lst]
,它应该是list(chain.from_iterable(flatten(sub) for sub in lst))
您的最终代码看起来像
def flatten(lst):
from itertools import chain
if isinstance(lst,int):
return [lst]
elif lst==[]:
return lst
else:
return list(chain.from_iterable(flatten(sub) for sub in lst))
答案 1 :(得分:0)
不使用itertools
def flatten(items):
for elem in items:
if isinstance(elem,list):
for sub_elem in flatten(elem):
yield sub_elem
else:
yield elem
In [8]: list(flatten([[[1],[2,[1]]]]))
Out[8]: [1, 2, 1]
答案 2 :(得分:0)
您可以使用如下参数引入结果值,并按递下方式检索值:
def flatten(l, res=[]):
if isinstance(l,list):
for i in l:
flatten(i,res)
return res
else:
res.append(l)
return res
print flatten([[[1],[2,[1]]]])
输出:
[1, 2, 1]