【发布时间】:2018-06-24 00:41:49
【问题描述】:
我在 Python 中使用了一些生成器,并尝试使用 简单的递归方案来实现扁平化函数。也就是说,一个函数将一个可能包含子列表的列表作为输入,并输出一个仅对输入的原子元素进行迭代的可迭代对象。
所以,print(list(flatten([1,2,3,[4,5,6]]))) 应该返回包含 [1,2,3,4,5,6] 的内容。
我的尝试如下:
def flatten(toflatten):
try:
for element in toflatten:
flatten(element)
except TypeError:
yield toflatten
所以,它应该检查它的参数是否是一个可迭代的对象。如果是这种情况,也递归此对象。否则,将其作为原子元素输出。
这不起作用,flatten([1,2,3,[4,5,6]]) 仅返回一个空列表。
为什么会这样?特别是;为什么它甚至不对该输入执行递归函数调用? (我使用的是 Python 3.5)
【问题讨论】:
-
首先,您希望
flatten(element)做什么?此行不返回/产生任何内容,也不改变任何数据结构,因此毫无意义。 -
我知道如果您的最终目标是学习递归,这将无济于事,但请尝试
sum(yourlist,[])这将使您的列表变平。我建议最后返回您的清单。 -
@TomosWilliams 不,你不能连接整数和列表。
-
你应该把
try-exceptinside循环。 -
@timgeb 啊,你是对的!这正是我在扁平化列表时倾向于使用的技巧
标签: python python-3.x list recursion generator