我有一个项目列表,来自一个A类型的对象,以及一个对B类对象进行操作的库。
我想将A转换为B,然后以pythonic方式调用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)))
答案 0 :(得分:2)
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
将接受可变数量的函数,并返回一个接受单个值的新函数。然后,该值将通过之前提到的每个函数(链中)传递,直到最终结果为止。
map (combine (convert_A_to_B, B.function), a_list)
答案 1 :(得分:1)
我在这里使用列表理解而不是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]