嵌套列表中元素的 Python SUMPRODUCT

EGM*_*686 7 python

我有两个嵌套列表:

\n
a = [[1,2,3],[2,4,2]]\nb = [[5,5,5],[1,1,1]]\n
Run Code Online (Sandbox Code Playgroud)\n

我想将每组元素相乘并求和得到

\n
c = [[30],[8]]\n
Run Code Online (Sandbox Code Playgroud)\n

哪个结果来自= [[1*5+2*5+3*5],[2*1,4*1,2*1]]

\n

我\xc2\xb4ve尝试这样做:

\n
a = [[1,2,3],[2,4,2]]\nb = [[5,5,5],[1,1,1]]\n
Run Code Online (Sandbox Code Playgroud)\n

但我得到“无法将序列乘以“列表”类型的非 int”

\n

是否有一种简单的列表理解方法可以避免 for 循环?

\n

pyl*_*ang 5

UPDATE在Python 3.12+中使用math.sumprod(),大致相当于

sum(itertools.starmap(operator.mul, zip(vec1, vec2, strict=True)))

请参阅@knia 的解决方案。


实现dotproduct itertools 配方(在 Python 3.11 中删除):

import operator


def dotproduct(vec1, vec2):
    return sum(map(operator.mul, vec1, vec2))
Run Code Online (Sandbox Code Playgroud)

代码

a = [[1,2,3], [2,4,2]] 
b = [[5,5,5], [1,1,1]]

[[dotproduct(x, y)] for x, y in zip(a, b)]
# [[30], [8]]
Run Code Online (Sandbox Code Playgroud)


Bil*_*ill 0

您可以使用嵌套列表理解来完成此操作,但这会很复杂。这里是一步一步进行。

a = [[1,2,3],[2,4,2]]
b = [[5,5,5],[1,1,1]]
result1 = [[x*y for x, y in zip(r1, r2)] for r1, r2 in zip(a, b)]
c = [[sum(r)] for r in result1]

c
[[30], [8]]
Run Code Online (Sandbox Code Playgroud)