练习:在没有列表推导的情况下在Python中映射或缩小地图?

时间:2009-12-10 22:55:13

标签: python functional-programming map

当我开始编写这个问题时,我没有想到嵌​​套列表的简单解决方案,但现在无论如何都希望找到一个。

这是一个丑陋的代码:

fun0(
    fun1(fun2(fun3(arg1))),
    fun1(fun2(fun3(arg4))),
    fun1(fun2(fun3(arg4))),
    fun1(fun2(fun3(arg4))))

哎哟!给出了名称以供示例。在实际应用中,他们的名字没有这样的模式。

我在map(map ...)reduce(map ...)得到错误的结果或TypeError之前玩了一下,然后再去写这篇文章。当然,简单的解决方案是在编写问题时使用:使用列表推导。像这样的东西(尚未测试):

fun0([i(j) for i in (fun1, fun2, fun3) for j in (arg1, arg2, arg3, arg4)])

不过,我想知道如何才能通过功能编程工具实现相同的目标?

fun0(map(fun1, map(fun2, map(fun3,
(arg1, arg2, arg3, arg4)))))

我认为还有一种模式可以删除。我试过map(map, (fun1, ...), (arg1, ...)),但这样Python试图迭代每个参数并引发错误。

3 个答案:

答案 0 :(得分:2)

你的3个例子做了3件不同的事。

您的原件与

相同
fun0(map(lambda x:fun1(fun2(fun3(x))), [arg1,arg2,arg3,arg4])

你的第二个例子,如果你绝对想要一个功能形式,可能就像

fun0(map(apply, itertools.product([fun1,fun2,fun3],[arg1,arg2,arg3,arg4])))

答案 1 :(得分:1)

def composed(x): return fun1(fun2(fun3(x)))

fun0(*map(composed, (arg1, arg2, arg3, arg4)))

当然,您可以使用lambda,而不是命名中间函数composed,但我发现这种方式更具可读性。

请注意*是至关重要的,否则你用一个参数,一个列表调用fun0,而不是用四个参数调用它! - )

答案 2 :(得分:-1)

重写第一个代码块的最有效方法是组合三个函数,将组合函数映射到参数列表,然后将fun0应用于列表。 Python实际上没有一种自然的方式来进行函数组合,所以像Jimmy的解决方案就是你最终会遇到的。

但是,Python风格倾向于阻止lambdas,所以我可能会把它写成列表理解而不是地图:

fun0(*[fun1(fun2(fun3(x))) for x in [arg1, arg2, arg3, arg4]])

编辑:错过了fun0需要单独的参数,而不是列表;根据Alex Martelli的帖子添加*