Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用toolz制作总是返回列表的curry版本的地图_Python_Toolz - Fatal编程技术网

Python 如何使用toolz制作总是返回列表的curry版本的地图

Python 如何使用toolz制作总是返回列表的curry版本的地图,python,toolz,Python,Toolz,如果我使用 from toolz.curried import * 然后,map会自动变成咖喱形式,所以 map(func,[[1,2],[3,4]]) 可以写成 map(func)([[1,2],[3,4]]) 但是curriedmap总是返回一个iterable。我用一种方法定义了一个curriedlmap,它总是返回列表。但简单的尝试 lmap=compose(list,map) 例如,它不会起作用 lmap(len)([[1,2],[3,4]]) 将给予 -----------

如果我使用

from toolz.curried import *
然后,
map
会自动变成咖喱形式,所以

map(func,[[1,2],[3,4]])
可以写成

map(func)([[1,2],[3,4]])
但是curried
map
总是返回一个iterable。我用一种方法定义了一个curried
lmap
,它总是返回列表。但简单的尝试

lmap=compose(list,map)
例如,它不会起作用

lmap(len)([[1,2],[3,4]])
将给予

---------------------------------------------------------------------------
类型错误回溯(最近的调用 最后)在() ---->1 lmap(len)([1,2],[3,4]]

C:\ProgramData\Anaconda3\lib\site packages\toolz\functoolz.py in
呼叫(self,*args,**kwargs)
466 ret=自我优先(*args,**kwargs)
467用于自函数中的f:
-->468 ret=f(ret)
469返回ret
470

TypeError:“curry”对象不可编辑


那么,如何定义一个curried
lmap

您称它为错误的方式<传递给compose的代码>映射是curry,但不是整个表达式。当你这样称呼它的时候

lmap(len)([[1,2],[3,4]])
它将
len
传递到
lmap
并返回
toolz.functoolz.curry
等价于

map(len)
然后尝试在其上调用
list

list(map(len))
这显然是行不通的。如果未失败,则完整表达式将等效于:

list(map(len))([[1,2],[3,4]])
而您要找的电话是:

list(map(len), [[1,2],[3,4]])
所以事实上,咖喱在这里没有多大意义

您可能希望在以下方面有所改进:

def lmap(g): return compose(list, map(g)) 
可根据您的需要调用:

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

但老实说,这个问题看起来有点人为——这是
toolz
在统一懒惰方面的最大优势。转换到
列表
会丢弃大部分内容。

您称之为错误的方式<传递给compose的代码>映射是curry,但不是整个表达式。当你这样称呼它的时候

lmap(len)([[1,2],[3,4]])
它将
len
传递到
lmap
并返回
toolz.functoolz.curry
等价于

map(len)
然后尝试在其上调用
list

list(map(len))
这显然是行不通的。如果未失败,则完整表达式将等效于:

list(map(len))([[1,2],[3,4]])
而您要找的电话是:

list(map(len), [[1,2],[3,4]])
所以事实上,咖喱在这里没有多大意义

您可能希望在以下方面有所改进:

def lmap(g): return compose(list, map(g)) 
可根据您的需要调用:

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

但老实说,这个问题看起来有点人为——这是
toolz
在统一懒惰方面的最大优势。转换到
列表
会扔掉大部分内容。

这个问题目前是谷歌搜索结果中的头号问题,因为toolz错误
“curry”对象不可编辑
。触发此错误消息的另一种方法是尝试将
toolz.curried.pipe
与curried迭代器一起使用,就像
pipe
本身是curried一样:

>>> transform = pipe(
    map(lambda x: x + 1),
    map(lambda x: x + x)
    )
>>> list(transform([3,4,5]))
TypeError: 'curry' object is not iterable
这里,第一个curried映射作为最后一个参数传递给第二个; 尽管从curried名称空间重新导出了管道,但管道不是curried的。解决方案是升级到toolz版本0.10.0(如果尚未使用),并使用
toolz.curried.compose__left
,它实际上是一个curried
管道

>>> transform = compose_left(
    map(lambda x: x + 1),
    map(lambda x: x + x)
    )
>>> list(transform([3,4,5]))
[8, 10, 12]

这个问题目前在谷歌搜索结果中排名第一,因为toolz错误“curry”对象不可编辑。触发此错误消息的另一种方法是尝试将
toolz.curried.pipe
与curried迭代器一起使用,就像
pipe
本身是curried一样:

>>> transform = pipe(
    map(lambda x: x + 1),
    map(lambda x: x + x)
    )
>>> list(transform([3,4,5]))
TypeError: 'curry' object is not iterable
这里,第一个curried映射作为最后一个参数传递给第二个; 尽管从curried名称空间重新导出了管道,但管道不是curried的。解决方案是升级到toolz版本0.10.0(如果尚未使用),并使用
toolz.curried.compose__left
,它实际上是一个curried
管道

>>> transform = compose_left(
    map(lambda x: x + 1),
    map(lambda x: x + x)
    )
>>> list(transform([3,4,5]))
[8, 10, 12]