Python3中以Pythonic方式相互乘列表内容
我注意到这个问题之前已经有人问过了,不过那主要是关于python2的:如何用Python把列表里的所有项相乘?
在python3中,reduce这个功能已经不再推荐使用了(可以看看这个链接:reduce()有什么问题?),那么现在有什么好的方法可以把一组数字相乘呢?
比如说,给定一个列表 [1,3,7,1,2]
,我们想要得到的结果是 1*3*7*1*2
。
我现在用的方式是这样的:
def foo(list)
sum = 1
for i in list:
sum *= i
return sum
我其实希望能有一个一行代码的写法,不想用 from functools import reduce
。
类似于: total = sum(b for a,b in items)
,但是是用来相乘的。
1 个回答
3
大家对 reduce
的主要反对意见似乎是有人用随意的函数来滥用它。如果你使用简单的、已经存在的关联运算符,那就没有理由不使用 reduce
。
from functools import reduce
from operator import mul
x = reduce(mul, [1,3,7,1,2])
你甚至可以更进一步,使用 functools.partial
来组合 reduce
和 mul
。
product = functools.partial(functools.reduce, operator.mul)
x = product(b for a, b in items)