【问题标题】:Combine functions to later use in map组合功能以供以后在地图中使用
【发布时间】:2015-12-31 10:51:00
【问题描述】:

我有一个项目列表,来自一个 A 类型的对象,以及一个对 B 类型的对象进行操作的库。

我想将 A 转换为 B,然后以 Python 方式调用 B 的函数。到目前为止我想出了什么:

def convert_A_to_B(A):
    return B(A.something, A.something_else)

def doStuff(a_list):
    converted_to_b = list(map(convert_A_to_B, a_list)
    return list(map(B.function, converted_to_b))

我可以创建一个 lambda 来组合这些函数,但我觉得应该有一个更简单的方法。比如:

return list(map(combine(convert_A_to_B, B.function)))

【问题讨论】:

  • 你为什么要在map() 上为converted_to_b 打电话给list()?这在这里完全是多余的。
  • 你说得对,不过我需要最后一次转换
  • 什么是combine()?我在 2.7、3.3、3.5 文档中找不到它。
  • Combine 是我正在寻找的一个功能,我也找不到它。它接受一个函数列表并创建一个新函数,该函数调用每个函数,将结果作为参数传递给下一个
  • 请善待将此详细信息添加到您的帖子中。 :)

标签: python function dictionary map-function


【解决方案1】:
from functools import partial, reduce
combine = lambda *xs: partial (reduce, lambda v,x: x(v), xs)

函数可用如combine (A.foo, A.bar) (x) 等价于A.bar(A.foo (x))

combine 将接受可变数量的函数,并返回一个接受单个值的新函数。然后,这个值将传递给前面提到的每个函数(链中),直到最终结果为 yield。


示例用法

map (combine (convert_A_to_B, B.function), a_list)

【讨论】:

  • 您的代码似乎有错误,我收到的可以使用星号表达式作为分配目标
  • 我已经编辑了您的答案以删除uppacking,没有它也可以正常工作
【解决方案2】:

我会在这里使用列表理解而不是list(map(...))

return [B(A.something, A.something_else).function() for A in a_list]

您可以对map()lambda 执行相同的操作,但以上内容更具可读性:

return list(map(lambda A: B(A.something, A.something_else).function(), a_list))

如果您想重复使用converted_to_b,请这样做:

return [converted_to_b(A).function() for A in a_list]

【讨论】:

  • 我还需要把 convert_A_to_B 放在某个地方
  • 这是一个最小的例子,实际功能有点长
  • @BartlomiejLewandowski:对,然后在列表推导中使用它而不是 B(...) 表达式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-23
  • 1970-01-01
  • 2013-09-09
  • 1970-01-01
相关资源
最近更新 更多