在python中使用map的递归

s00*_*007 6 python recursion dictionary functional-programming

我正在努力学习函数式编程概念.练习,使用map/reduce展平嵌套列表.我的代码.

lists = [ 1 , 2 , [ 3 , 4, 5], 6, [7, 8, 9] ]
def flatten(lists):
      return map(lambda x: flatten(x) if isinstance(x,list) else x, lists)

print flatten(lists)
Run Code Online (Sandbox Code Playgroud)

我输出与输入相同.我做错了什么 ?递归如何与map()一起使用?

Dun*_*can 8

下面是一个使用这两种解决方案mapreduce:

def flatten(seq):
    return reduce(operator.add, map(
        lambda x: flatten(x) if isinstance(x,list) else [x],
        seq))
Run Code Online (Sandbox Code Playgroud)

正如Martijn所说,map在输入时产生的项目数量相同,因此外部步骤需要是reduce为所有输入产生单个输出的调用.map可以在这里使用,以使所有输入一致:即一系列列表.


Mar*_*ers 5

你可以不解决这个问题map().递归调用返回一个列表,因此对于输入中的列表,您将结果替换为另一个列表.map()毕竟,总是必须在输出中产生与输入中给出的元素相同数量的元素.

随着reduce()您可以添加多个元素添加到现有列表:

def flatten(lists):
    return reduce(lambda res, x: res + (flatten(x) if isinstance(x, list) else [x]), lists, [])
Run Code Online (Sandbox Code Playgroud)

这从一个空列表开始,并为每个元素添加元素lists.如果该元素本身就是一个列表,则使用递归.

这会产生预期的输出:

>>> def flatten(lists):
...     return reduce(lambda res, x: res + (flatten(x) if isinstance(x, list) else [x]), lists, [])
...
>>> lists = [ 1 , 2 , [ 3 , 4, 5], 6, [7, 8, 9] ]
>>> flatten(lists)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)