关于python:如何使用toolz制作总是返回列表的咖喱版地图

How to make a curry version of map that always returns list using toolz

如果我使用导入toolz

1
from toolz.curried import *

那么,map将自动成为课程表,因此

1
map(func,[[1,2],[3,4]])

可以写为

1
map(func)([[1,2],[3,4]])

但是curried map总是返回一个iterable。我想定义一个经常返回列表的curried lmap。但简单的尝试

1
lmap=compose(list,map)

不会工作,例如

1
lmap(len)([[1,2],[3,4]])

将给予

--------------------------------------------------------------------------- TypeError Traceback (most recent call
last) in ()
----> 1 lmap(len)([[1,2],[3,4]])

C:\ProgramData\Anaconda3\lib\site-packages\toolz\functoolz.py in
call(self, *args, **kwargs)
466 ret = self.first(*args, **kwargs)
467 for f in self.funcs:
--> 468 ret = f(ret)
469 return ret
470

TypeError: 'curry' object is not iterable

那么如何定义课程lmap


你说的不对。传递给compose的map是循环的,但不是一个完整的表达式。当你这样称呼它

1
lmap(len)([[1,2],[3,4]])

它将len传递给lmap它返回toolz.functoolz.curry相当于

1
map(len)

然后打电话给list

1
list(map(len))

这显然行不通。如果它没有失败,完整表达式将等价于:

1
list(map(len))([[1,2],[3,4]])

当你要找的电话是:

1
list(map(len), [[1,2],[3,4]])

所以事实上,这里的货币兑换没有什么意义。

你可能想在这些线条周围做些什么:

1
def lmap(g): return compose(list, map(g))

您可以随意调用:

1
2
>>> lmap(len)([[1,2],[3,4]])
[2, 2]

但坦诚地说,这个问题看起来有点虚假——EDCOX1在统一懒惰中的最大优势5。转换为EDCOX1,4,则抛出大部分。