我有一个简单的例子:
import numpy as np
func_dict1 = {0: np.sin, 1: np.cos, 2: np.tan}
out = map(func_dict1.get, np.array([0, 2, 0]))
在这里,我根据它们的字典键挑选出三个函数。现在我想向每个函数传递唯一的参数,如下所示:
[f(x) for f,x in zip(out, [3,1,2])]
其呈现输出:
[0.1411200080598672, 1.557407724654902, 0.9092974268256817]
但是我如何使用map
做到这一点呢?
我原以为这会奏效,但事实并非如此:
map(out, [3,1,2])
我哪里错了?与列表理解相比,使用map
有什么好处吗?我之前认为速度更快,但我承认自己不是这方面的专家。
map
被设计为采用单个函数并将其应用于可迭代中的每个项。您正在将不同的函数应用于不同的项。我认为列表理解是一种优雅的方式
警告:您可能不想使用map
,这个答案可能会让您感到困惑,而不是帮助;(。
然而,正如您所问的,如何使map
做到这一点,以及它是python,让我们接受挑战:实现您想要的目标的一种方法是将out
封装在一个可调用的对象中(因此行为类似于函数(,并且在每次调用时也会前进到next
函数。例如:
# yours
import numpy as np
func_dict1 = {0: np.sin, 1: np.cos, 2: np.tan}
out = map(func_dict1.get, np.array([0, 2, 0]))
# extend like this
class FuncIterCaller:
def __init__(self, funcs):
self.funcs = funcs
def __call__(self, *args, **kwds):
return next(self.funcs)(*args, **kwds)
res = map(FuncIterCaller(out), [3,1,2])
# to see what's inside:
print(list(res))