将序列转换为列表的功能

use*_*964 8 python functional-programming toolz

我们知道

list(map(f,[1,2],[3,4],[6,7]))
Run Code Online (Sandbox Code Playgroud)

相当于

[f(1,3,6),f(2,4,7)]
Run Code Online (Sandbox Code Playgroud)

我想知道是否有tolist相当于的内置函数[],所以

tolist(a,b,c,d)
Run Code Online (Sandbox Code Playgroud)

相当于[a,b,c,d].

我认为这样的函数在函数式编程中很有用.因为许多函数采用list参数而不是sequence.

当然,一个简单的自定义方式是lambda *x:list(x),但我总觉得它在语法上很麻烦,特别是在函数式编程风格中使用它

map(lambda *x:list(x),[1,2],[3,4],[6,7])
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,如果没有这样的内置tolist,我们是否可以使用FP包更加优雅地构建它toolz

PS:我实际想要实现的是添加的线程版本(我知道numpy,但我现在不想使用它)

from toolz.curried import *
import operator as op
def addwise(*args):
    return list(map(compose(reduce(op.add),lambda *x:list(x)),*args))
Run Code Online (Sandbox Code Playgroud)

然后

addwise([1,2],[3,4],[6,7])
Run Code Online (Sandbox Code Playgroud)

会给

[10, 13]
Run Code Online (Sandbox Code Playgroud)

hi-*_*zir 1

如果

函数很有用(....)因为许多函数都采用列表参数

这是一个好兆头,lambda表明表达方式不合适。您不想每次应用此模式时都重复一遍。

遗憾的是,我们离 Clojure 的简洁性还很远:

user=> (map + [1 2] [3 4] [6 7])
(10 13)
Run Code Online (Sandbox Code Playgroud)

但我们仍然可以用一种相当 Pythonic 和优雅的方式来表达它:

def apply(f):
    def _(*args):
        return f(args)
    return _ 
Run Code Online (Sandbox Code Playgroud)

可以用作:

from toolz.curried import reduce 

map(apply(reduce(op.add)), [1,2], [3,4], [6,7])
Run Code Online (Sandbox Code Playgroud)

甚至更好

map(apply(sum), [1,2], [3,4], [6,7])
Run Code Online (Sandbox Code Playgroud)

尽管在这种情况下map,可以与zip

map(sum, zip([1, 2], [3, 4], [6, 7])))
Run Code Online (Sandbox Code Playgroud)