我搜索并发现具有相同标题的问题也是 ( here here here here here ) 但我不是问那个。我遇到了问题:
编写一个函数来展平列表。该列表包含其他列表、字符串或整数。
我的代码是
t=[]
def flatten(aList):
for i in aList:
if type(i) !=list:
t.append(i)
else:
flatten(i)
return t
但是当我检查测试用例的代码时:
flatten([[1], [1]])
:检查器告诉我输出是[1, 1, 1, 1]
但在 codeskulptor 中我得到正确的输出,即[1, 1]
。flatten([[[1]], [[[5]]]])
:检查器告诉输出是[1, 1, 1, 1, 1, 2 , 3, 3, 2, 1, 0, 4, 5, 6, 7, 1, 5]
但在 codeskulptor 中告诉[1, 5]
。
许多测试用例都存在这个问题。
然后我在 python tutor 中检查了我的代码,发现在每次返回列表 t
时执行 if 语句后,最后当函数停止时它返回最后编辑的列表 t
.
我该如何解决这个问题,请帮助我,是的,我是 python 的新手,对 itertools、lambda 函数用法、生成器等一无所知,所以请在我能理解的上下文中告诉我。
最佳答案
您的代码依赖于全局;如果检查器两次调用您的函数,它将收到比预期更长的列表:
>>> t = []
>>> def flatten(aList):
... for i in aList:
... if type(i) !=list:
... t.append(i)
... else:
... flatten(i)
... return t
...
>>> flatten([1, 1])
[1, 1]
>>> flatten([1, 1])
[1, 1, 1, 1]
>>> t # your global, still holding all those values:
[1, 1, 1, 1]
不要使用全局变量。使用本地列表,并使用递归调用的结果扩展它:
def flatten(aList):
t = []
for i in aList:
if not isinstance(i, list):
t.append(i)
else:
t.extend(flatten(i))
return t
请注意,我切换到使用 isinstance()
来测试类型。这个版本不会受到共享状态泄漏到下一个调用的影响:
>>> def flatten(aList):
... t = []
... for i in aList:
... if not isinstance(i, list):
... t.append(i)
... else:
... t.extend(flatten(i))
... return t
...
>>> flatten([1, 1])
[1, 1]
>>> flatten([1, 1])
[1, 1]
>>> flatten([[[1]], [[[5]]]])
[1, 5]
>>> flatten([1, 1, [42, 81]])
[1, 1, 42, 81]
关于python - 递归地展平 Python 中的不规则列表列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35415797/