我搜索并发现同一标题的问题也是(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导师中检查了我的代码,发现每次返回列表t
后执行if语句,并在函数停止时最后执行,返回最后编辑的列表t
我如何解决这个问题请帮助我这个,是的我是python的新手,并且对itertools,lambda函数用法,生成器等一无所知。所以请在我能理解的上下文中告诉我。< / p>
答案 0 :(得分:4)
您的代码依赖于全球;如果检查程序两次调用您的函数,它将收到比预期更长的列表:
>>> 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]