2

假设我有 3 个列表

x1 = [1, 2, 3, 4]
x2 = [2, 3, 4, 5]
x3 = [3, 4, 5, 6]

我想根据索引减少这个列表列表。

我们可以通过对元素求和来减少这种情况:-x1[i] + x2[i] + x3[i]

out = [6, 9, 12, 15]

或相乘:-x1[i] * x2[i] * x3[i]

out = [6, 24, 60, 120]

python中实现这一目标的最佳方法是什么?

编辑:

有没有办法为列表列表执行此操作?

4

2 回答 2

7

您可以使用zipsum功能。

out = [sum(i) for i in zip(x1, x2, x3)]

对于乘法,您可以使用reduce(对于 Python 2)

out = [reduce(lambda a, b: a * b, i) for i in zip(x1, x2, x3)]

您可以reducefunctoolsPython 3 中获取。

但是,您也可以定义自己的乘法函数,然后在列表推导中使用该函数。

def mult(lst):
    mul = 1
    for i in lst:
        mul *= i
    return mul

out = [mult(i) for i in zip(x1, x2, x3)]

如果您有一个列表列表,lst = [[1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6]]那么您需要做的就是替换zip(x1, x2, x3)zip(*lst). 运算符基本上解包列表的*元素并将它们作为单独的参数提供给函数。

例如:

out = [sum(i) for i in zip(*lst)]
于 2013-03-13T11:37:20.623 回答
3

使用zip(*data)

data = [
[1, 2, 3, 4],
[2, 3, 4, 5],
[3, 4, 5, 6]
]

print [sum(col) for col in zip(*data)]

import operator
def product(data):
    return reduce(operator.mul, data)

print [product(col) for col in zip(*data)]

如果你想用非常大的数据进行计算,我建议你使用 NumPy:

import numpy as np

print np.sum(data, axis=0)
print np.product(data, axis=0)
于 2013-03-13T13:00:08.837 回答