我需要递归地展平列表:
在列表如下所示之前:
L=[1,[2,[‘a’,(3,’b’)]],(5,6),([11,22])]
之后:
Lflat=[1,2,’a’,(3,’b’),(5,6),([11,22])]
我的代码遇到了一个问题(lst1是空的lst1)
def list_flatten(lst,lst1):
for item in lst:
if type(item) == tuple:
print(item)
lst1.append(item)
elif type(item) == list:
list_flatten(item,lst1)
else:
lst1.append(item)
return lst1
这将返回以下内容:
输出:[1, 2, 'a', (3, 'b'), (5, 6), 11, 22]
这让我发现([])被认为是一个列表,而不是元组。你知道吗
现在我的问题如下:
您可以注意到,您需要的是:
在Python代码中,它会导致:
如预期所示:
你的
list_flatten
函数改变了lst1
参数,所以你不需要返回任何东西。你可以这样称呼它:输出
建议使用
isinstance
而不是type
,因为这使代码更通用:它还可以处理从list
派生的对象。你知道吗我们可以重新编写函数,这样您就不需要传入
lst1
:我们给
lst1
一个默认值None
,并在递归的顶层将名称lst1
重新绑定到一个空列表以收集结果。你知道吗我们不能给
lst1
一个默认值[]
。这是因为默认参数是在编译函数时创建的,而不是在调用函数时创建的,如果我们给lst1
一个默认值[]
,那么每次调用都会使用相同的列表。它看起来像我们第一次使用list_flatten
时所希望的那样,但是在随后的调用中,它的行为并不像我们所希望的那样。下面是一个简短的演示。你知道吗输出
如您所见,
lst1
保留了第一次调用的内容。有关此重要主题的详细信息,请参阅“Least Astonishment” and the Mutable Default Argument。有时,这种behviour是可取的,但在这种情况下,明智的做法是在代码中添加注释,说明您有意使用可变的默认参数。你知道吗另一种方法是将
list_flatten
生成一个生成器,并将其输出收集到一个列表中:在Python的最新版本中,可以用
[*list_flatten(L)]
替换list(list_flatten(L))
。你知道吗Python 2没有
yield from
,但是您可以将该行替换为:如果您实际上不需要列表,可以这样调用生成器:
输出
相关问题 更多 >
编程相关推荐