注意:请在评论之前阅读下面的更好的更新部分。这里有一些微妙之处。据我所知,给出的答案都没有在上下文中起作用。
我试图找到一个功能略有不同的python'map'函数的模拟。这最好通过例子来解释。“地图”功能执行以下操作:
In [1]: def f(x,y):
return x+y
In [2]: map(f, ['a','b','c'],['1','2','3'])
Out[2]: ['a1', 'b2', 'c3']
所以,map 把 f 变成了一个新的函数,我们称之为 f_zipper。f_zipper 压缩其参数并将 f 应用于每个压缩对。
我想要构建的是一个我称之为“magical_map”的函数,其行为如下:
In [1]: def f(x,y):
return x+y
In [2]: magical_map(f, ['a','b','c'],'1')
Out[2]: ['a1', 'b1', 'c1']
所以 magic_map 对 f 进行了一堆调用(第一个参数列表中的每个元素一个),但是它将它们全部折叠到第二个参数上。
注意:可以这么说,我需要一个真正实用的解决方案,因为我无法访问第二个参数。
即我稍后要做的是构建以下函数:
intermed_func = functools.partial(magical_map, f)
final_func = functools.partial(intermed_func, arg_I_know)
那么 final_func 可以称为
final_func(last_min_arg)
并返回
[f(arg_I_know[0], last_min_arg), f(arg_I_know[1], last_min_arg), ...]
我基本上对如何构建“magical_map”感到困惑。任何帮助都会很棒。我没有太多运气找到关于这个主题的任何东西。
谢谢!
更好的更新:
在上下文中解决问题比简单地编写一个在两个参数同时已知时起作用的函数要困难得多。问题是,它们在这种情况下并不为人所知。更准确地说,我需要能够将以下“final_func”应用于所有三个字符串。现在,使用“地图”会产生以下行为。
def splitfunc(string, arg):
return string.split(arg)
intermed_func = functools.partial(map, splitfunc)
final_func = functools.partial(intermed_func, ["a_b","v_c","g,g"])
final_func("_")
Out[xx]: [['a', 'b'], ['v_c'], ['g,g']]
但是当我按照建议(以下面的所有方式)定义magic_map时,我会得到错误或不正确的行为。例如。
def magical_map(func, mylist, arg):
return map(f, mylist, [arg]*len(mylist))
然后我运行:
intermed_func = functools.partial(magical_map, splitfunc)
final_func = functools.partial(intermed_func, ["a_b","v,c","g,g"])
final_func("_")
我得到:
['a_b_', 'v,c_', 'g,g_']