我们知道
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]
。
我觉得这样的函数在函数式编程中很有用。因为许多函数采用列表参数而不是序列。
当然,一个简单的自定义方式是lambda *x:list(x)
,但我总觉得它在语法上很麻烦,尤其是在函数式编程风格中使用它
map(lambda *x:list(x),[1,2],[3,4],[6,7])
所以我的问题是,如果没有这样的内置 tolist
,我们是否可以使用像 toolz
这样的 FP 包更优雅地动态构建它?
PS:其实我想实现的是线程版的add(我知道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]
最佳答案
如果
function is useful (....) Because many functions take list parameter
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])))
关于python - 将序列变成列表的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47321295/