【问题标题】:An Exercise: map or reduce a map in Python without list comprehensions?练习:在没有列表推导的情况下在 Python 中映射或减少映射?
【发布时间】:2009-12-11 07:15:46
【问题描述】:

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

这是一个丑陋的代码:

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

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

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

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 尝试遍历每个参数并引发错误。

【问题讨论】:

    标签: python functional-programming map


    【解决方案1】:

    你的 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】:
      def composed(x): return fun1(fun2(fun3(x)))
      
      fun0(*map(composed, (arg1, arg2, arg3, arg4)))
      

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

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

      【讨论】:

        【解决方案3】:

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

        不过,Python 风格往往不鼓励 lambda,所以我可能会将其写成列表推导式而不是映射:

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

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

        【讨论】:

          猜你喜欢
          • 2014-06-06
          • 2013-05-15
          • 2014-04-09
          • 2023-04-03
          • 1970-01-01
          • 2016-08-19
          • 1970-01-01
          • 2023-03-08
          • 1970-01-01
          相关资源
          最近更新 更多