我有两个嵌套列表:
\na = [[1,2,3],[2,4,2]]\nb = [[5,5,5],[1,1,1]]\nRun Code Online (Sandbox Code Playgroud)\n我想将每组元素相乘并求和得到
\nc = [[30],[8]]\nRun Code Online (Sandbox Code Playgroud)\n哪个结果来自= [[1*5+2*5+3*5],[2*1,4*1,2*1]]
我\xc2\xb4ve尝试这样做:
\na = [[1,2,3],[2,4,2]]\nb = [[5,5,5],[1,1,1]]\nRun Code Online (Sandbox Code Playgroud)\n但我得到“无法将序列乘以“列表”类型的非 int”
\n是否有一种简单的列表理解方法可以避免 for 循环?
\nUPDATE在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)
您可以使用嵌套列表理解来完成此操作,但这会很复杂。这里是一步一步进行。
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)