将序列转换为列表

时间:2017-11-16 03:52:03

标签: python functional-programming toolz

我们知道

list(map(f,[1,2],[3,4],[6,7]))

相当于

[f(1,3,6),f(2,4,7)]

我想知道内置函数tolist是否等同于[],所以

tolist(a,b,c,d)

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

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

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

map(lambda *x:list(x),[1,2],[3,4],[6,7])

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

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))

然后

addwise([1,2],[3,4],[6,7])

将给出

[10, 13]

1 个答案:

答案 0 :(得分:1)

如果

  

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

这是lambda表达不适合的一个好兆头。每次你想要应用这种模式时,你都不想重复自己。

可悲的是,我们远离Clojure的简洁性:

user=> (map + [1 2] [3 4] [6 7])
(10 13)

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

def apply(f):
    def _(*args):
        return f(args)
    return _ 

可以用作:

from toolz.curried import reduce 

map(apply(reduce(op.add)), [1,2], [3,4], [6,7])

甚至更好

map(apply(sum), [1,2], [3,4], [6,7])

虽然在这种情况下map,但可以与zip结合使用:

map(sum, zip([1, 2], [3, 4], [6, 7])))