给定一个嵌套的整数列表,实现一个迭代器将其平面化。每一个元素可以是整数,也可以是列表——列表的元素也可以是整数或者其他列表。例如,如果输入为[[1,1],2,[1,1]]
,则输出为是[1, 1, 2, 1, 1]
。如果输入为[1,[4,[6]]]
,则输出为[1, 4, 6]
def eb34(list1):
flat_list = []
for i in range(len(list1)):
if type(list[i]) == list:
flat_list += flatten(list1[i])
else:
flat_list.append(list1[i])
return flat_list
你可以使用递归:
def flatten(arg):
if not isinstance(arg, list): # if not list
return [arg]
return [x for sub in arg for x in flatten(sub)] # recurse and collect
print(flatten([[1,1],2,[1,1]])) # [1, 1, 2, 1, 1]
print(flatten([1,[4,[6]]])) # [1, 4, 6]
或者生成一个生成器,
def flatten(arg):
if not isinstance(arg, list): # if not list
yield arg
else:
for sub in arg:
yield from flatten(sub)
print(*flatten([[1,1],2,[1,1]])) # 1 1 2 1 1
print(*flatten([1,[4,[6]]])) # 1 4 6
我不知道你从哪里调用flatten()在你的代码。根据你提供的其他信息,我给你一个解决方案。
def eb34(list1):
flat_list = []
for i in list1:
if isinstance(i, list):
for j in eb34(i):
flat_list.append(j)
else:
flat_list.append(i)
return flat_list
你可以递归地把它压平:
def flatten_recursively(lst_in):
lst_out = []
for i in lst_in:
if type(i) == list:
for j in flatten_recursively(i):
lst_out.append(j)
else:
lst_out.append(i)
return lst_out
也可以查看这个答案,尽管您可能需要将其调整为Python 3+: https://stackoverflow.com/a/10824420/18189622
从嵌套列表中创建平面列表的最简单方法是使用itertools模块。itertools模块有一个名为chain的函数,它接受一个列表的列表并返回一个列表。
>>> import itertools
>>> nested_lists = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> flat_list = list(itertools.chain(*nested_lists))
>>> flat_list
[1, 2, 3, 4, 5, 6, 7, 8, 9]