我不知道我的代码有什么问题。我不断得到无限循环错误。 我的代码是:
def flatten(aList):
x = 0
while any_list_in(aList):
fList = []
for i in aList:
fList.append(i)
aList = fList
else:
return aList
aList = [[1,'a',['cat'],2],[[[3]],'dog'],4,5]
def any_list_in(obj):
return any(isinstance(item, list) for item in obj)
flatten(aList)
答案 0 :(得分:1)
我不会尝试诊断代码中的错误,但这是另一种解决方案。
我会使用yield
来构建返回值,而无需将它们添加到任何类型的列表中。如果您在进行检查时不需要函数any_list_in
。如果它是一个列表,那么你使用递归来处理该列表,否则只是从当前的iterable中产生每个值。
def flatten(iterable):
for i in iterable:
if isinstance(i, list):
# python 3.4+ can take out the loop
#yield from flatten(i)
for f in flatten(i):
yield f
else:
yield i
aList = [[1,'a',['cat'],2],[[[3]],'dog'],4,5]
print(list(flatten(aList)))
如果你不能使用yield
(你很差),那么你只需要建立一个值列表并返回(作为读者的练习)。
答案 1 :(得分:0)
这可能是你想要的。 "平坦化"创建一个新的列表"并使用辅助函数以递归方式将原始列表展平为新列表。
def flatten_impl(item, newlist):
if type(item) == list:
for i in item:
flatten_impl(i, newlist)
else:
newlist.append(item)
def flatten(aList):
newlist = []
flatten_impl(aList, newlist)
return newlist
答案 2 :(得分:0)
这是一个flatten_list
函数,它保留了排序并支持任意嵌套列表以及非列表项:
def flatten_list(obj):
flat_list = []
for item in obj:
if isinstance(item, list):
flat_list += flatten_list(item)
else:
flat_list.append(item)
return flat_list
输出:
>>> aList = [[1, 'a', ['cat'], 2], [[[3]], 'dog'], 4, 5, [[[6,7],8],9]]
>>> flatten_list(alist)
[1, 'a', 'cat', 2, 3, 'dog', 4, 5, 6, 7, 8, 9]