下面是我压缩python列表的代码。我曾尝试使用递归的概念来做同样的事情。输入是整数,字符串或列表。我所挣扎的是,我无法理解为什么我的回报会给我一个重复值列表?我该如何纠正?
copyList = []
def flatten(aList):
for char in aList:
if isinstance(char,int) or isinstance(char,str):
copyList.append(char)
else:
char_pos = aList.index(char) + 1
return flatten(char) + flatten(aList[char_pos:len(aList)])
print copyList
return copyList
我的输出在获得正确的输出方面是正确的,但返回似乎给了我重复列表几次。无法理解出了什么问题!!
此处的示例输出:展平([1,' a',2,[[' alpha']],3,4])
[1,' a',2,' alpha'] [1,' a',' alpha'] [ 1,' a',2,' alpha',3,4]
Out [2] :[1,' a',2,' alpha',1,' a',2 ,' alpha',' a',2,' alpha', 3,4]
答案 0 :(得分:2)
def flatten_list(a, result=None):
""" Flattens a nested list. """
if result is None:
result = []
for x in a:
if isinstance(x, list):
flatten_list(x, result)
else:
result.append(x)
return result
print flatten_list([1,'a',2,[['alpha']],3,4])
答案 1 :(得分:1)
您错误地实现了递归。您必须初始化函数内的copyList
,然后在else
子句中附加到它:
def flatten(aList):
copyList = []
for char in aList:
if isinstance(char,int) or isinstance(char,str):
copyList.append(char)
else:
char_pos = aList.index(char) + 1
return copyList + flatten(char) + flatten(aList[char_pos:len(aList)])
return copyList
答案 2 :(得分:0)
无需手动搞乱列表:
def iflatten(seq):
for item in seq:
if isinstance(item, list):
for subitem in iflatten(item):
yield subitem
else:
yield item
def flatten(seq):
return list(iflatten(seq))
与写作时页面上的其他解决方案一样,它只处理非循环列表。
编辑:print
语句让我觉得OP使用的是Python 2,所以我用嵌套的for循环替换了yield from
表达式。