代码之家  ›  专栏  ›  技术社区  ›  culebrón

练习:在没有列表理解的情况下用python映射或减少映射?

  •  0
  • culebrón  · 技术社区  · 16 年前

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

    下面是一个丑陋的代码:

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

    哎哟!举例来说,给出了名称。在实际应用程序中,它们的名称没有这样的模式。

    我玩过一点 map(map ...) reduce(map ...) 得到错误的结果或 TypeError S,在去这里写这篇文章之前。当然,简单的解决方案是在编写问题时提出的:使用列表理解。类似这样的事情(尚未测试):

    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 回复  |  直到 16 年前
        1
  •  2
  •   Jimmy    16 年前

    你的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])))
    
        2
  •  1
  •   Alex Martelli    16 年前
    def composed(x): return fun1(fun2(fun3(x)))
    
    fun0(*map(composed, (arg1, arg2, arg3, arg4)))
    

    你可以使用 lambda 当然,不是命名中间函数 composed 但是我发现这样更易读。

    请注意 * 很重要,否则你打电话来 fun0 用一个参数,一个列表,而不是用四个参数来调用它!-)

        3
  •  -1
  •   C. A. McCann Ravikant Cherukuri    16 年前

    重写第一个代码块的最有效方法是组合三个函数,将组合的函数映射到参数列表上,然后将fun0应用到列表中。python并没有一种自然的方法来进行函数组合,所以类似于Jimmy的解决方案就是您将要结束的地方。

    但是,python风格倾向于不鼓励lambda,因此我可能会将其写为列表理解而不是映射:

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

    edit:缺少fun0需要单独的参数,而不是列表;正在添加 * 根据亚历克斯·马泰利的帖子。