Python:map()带有部分参数
我得到了一个多参数函数。我简化了要映射的函数,下面是我要测试的函数:Python:map()带有部分参数,python,Python,我得到了一个多参数函数。我简化了要映射的函数,下面是我要测试的函数: def _dist(I,J,X,Y): return abs(I-X)+abs(J-Y) 在某些情况下,我只想保持X,Y为常数,分别在u_X和u_Y上迭代I,J。我在下面写了一些东西(SyntaxError提出时) 其中cur.x()和cur.y()是常量。 无论如何,要用map()来做这件事?您不能使用列表理解吗 new = [_dist(x,y,i,j) for x in ux for y in uy] 其中,
def _dist(I,J,X,Y):
return abs(I-X)+abs(J-Y)
在某些情况下,我只想保持X,Y为常数,分别在u_X和u_Y上迭代I,J。我在下面写了一些东西(SyntaxError提出时)
其中cur.x()和cur.y()是常量。
无论如何,要用map()来做这件事?您不能使用列表理解吗
new = [_dist(x,y,i,j) for x in ux for y in uy]
其中,i
和j
是常数
请注意,这相当于
new = map(lambda (x,y): _dist(x,y,i,j), [(x,y) for x in ux for y in uy])
但要短一些(而且可能更有效)
编辑(回应@chepner的评论)-如果您想迭代
ux
和uy
的压缩产品,那么您可以这样做
new = [_dist(x,y,i,j) for (x,y) in zip(ux,uy)]
相反。注意区别-
>> ux = [1, 2, 3]
>> uy = [4, 5, 6]
>> [(x,y) for x in ux for y in uy]
[(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]
>> zip(ux, uy)
[(1, 4), (2, 5), (3, 6)]
您可以部分应用
\u dist
:
from functools import partial
_mapfunc = partial(_dist, X=cur.x(), Y=cur.y())
new = map(_mapfunc, u_x, u_y)
尽管Chris Taylor的列表理解可能更有效。您希望将
ux
和uy
压缩在一起;您的代码迭代的是ux
和uy
的笛卡尔积。@chepner我以为这就是目的map(func,L1,L2)
相当于[func(L1[0],L2[0]),func(L1[1],L2[1]),…,func(L1[-1],L2[-1])]
啊,好吧-我读到了短语“迭代I,J于u_x和u_y”,这对我来说是笛卡尔积。我忽略了代码,因为OP承认他们不知道自己在做什么;)
from functools import partial
_mapfunc = partial(_dist, X=cur.x(), Y=cur.y())
new = map(_mapfunc, u_x, u_y)