将内部列表的元素乘以列表理解

时间:2015-03-27 17:33:19

标签: python list collections list-comprehension

这可以使用列表推导单行完成吗?

lst = [[1, 2, 3], [1, 2, 3, 4], [5, 6], [9]]
products = ?? (Multiple each list elements)

所需输出= [6, 24, 30, 9]

我尝试过类似的事情:

products = [l[i] * l[i + 1] for l in lst for i in range(len(l) - 1)]

但没有用。

6 个答案:

答案 0 :(得分:9)

您可以使用reduce()将乘法应用于整数列表,并与operator.mul()一起进行实际乘法运算:

from functools import reduce

from operator import mul

products = [reduce(mul, l) for l in lst]

在Python 3中,reduce()已移至functools.reduce(),因此支持import语句。自从Python 2.6以来存在functools.reduce,如果您需要保持代码与Python 2和3兼容,则从那里导入它会更容易。

演示:

>>> from operator import mul
>>> lst = [[1, 2, 3], [1, 2, 3, 4], [5, 6], [9]]
>>> [reduce(mul, l) for l in lst]
[6, 24, 30, 9]

operator.mul()可以替换为lambda x, y: x * y,但为什么要养狗并自己吠?

答案 1 :(得分:3)

使用numpy

的另一种方法
>>> from numpy import prod
>>> [prod(x) for x in lst] 
[6, 24, 30, 9]

参考 - Documentation on prod

答案 2 :(得分:1)

是的,您可以在列表解析中使用reduce和lambda表达式:

>>> [reduce(lambda x, y: x * y, innerlst) for innerlst in lst]
[6, 24, 30, 9]

注意,在Python 3中,reduce已移至functools模块,因此您必须从中导入:

from functools import reduce

如果您不想使用lambda表达式,可以完全由operator.mul替换。

答案 3 :(得分:1)

使用this解决方案为列表创建产品运算符,您可以执行以下操作:

    lst = [[1, 2, 3], [1, 2, 3, 4], [5, 6], [9]]
    import operator
    from functools import reduce # Valid in Python 2.6+, required in Python 3
    def prod(numeric_list):
        return reduce(operator.mul, numeric_list, 1)

    [prod(l) for l in lst]

输出继电器:

    Out[1]: [6, 24, 30, 9]

答案 4 :(得分:0)

尝试:

products = [reduce(lambda x, y: x * y, l) for l in lst]

答案 5 :(得分:0)

开始Python 3.8,并将prod功能添加到math模块中:

import math

# lst = [[1, 2, 3], [1, 2, 3, 4], [5, 6], [9], []]
[math.prod(l) for l in lst]
# [6, 24, 30, 9, 1]

请注意,空子列表将获得1的乘积值,该乘积值由start的值定义:

  

math.prod(iterable,*,start = 1)