微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

一个字典 Python 的点积

如何解决一个字典 Python 的点积

我需要计算字典中两个键的点积。

res = {'Ben':['5','0','1','4','2'...],'Moose': ['5','5','3'...]}

我想制作这样的东西。我想将 Ben 的值与 Moose 的值相乘。

Ans = 31 [5*5 + 0*5 + 0*0 + 0*0 + 1*0 + 4*0 + 2*3...]

我怎样才能用字典做到这一点?有了这个列表,我可以直接调用 np.dot 函数或者写一个小循环。

解决方法

您可以在形成点积的列表推导式上使用 sum

res = {'Ben':['5','0','1','4','2'],'Moose': ['5','5','3']}

ans = sum(int(b) * int(m) for b,m in zip(res['Ben'],res['Moose']))
print(ans)

输出:

31
,

使用 zipsum 的一种方式:

sum(int(i) * int(j) for i,j in zip(*res.values()))

输出:

31

如果键的数量是动态的(因此列表的数量是动态的),您可以使用 operator.mulfunctools.reduce 创建一个可扩展的函数:

# Sample data with 3 keys

res3 = {'Ben':['5','3'],'Chris': ['5','3']}

from operator import mul
from functools import reduce

def cummul(iterable):
    return reduce(mul,(int(i) for i in iterable))

sum(cummul(it) for it in zip(*res3.values()))

输出:

143
,

对于 dict 中的任何键,只需使用 mathzip。请注意,math.prod 需要 python 3.8 或更高版本:

sum(math.prod(map(int,i)) for i in zip(*res.values()))
,

您可以使用 zip 并按如下方式一起迭代两个键:

sum = 0
for x,y in zip(res['Ben'],res['Moose']):
    sum += int(x) * int(y)
print(sum)
,

您可以执行类似的操作:

res = {'Ben':['5','3']}

ans = {}
for k,v in res.items():
    if(len(ans.keys())) == 0:
        ans = v
    ans_temp = [v1*v2 for v1,v2 in zip(ans,v)]
    ans = ans_temp

print(sum(ans))

 

这应该适用于任意长度的字典。

,

使用 numpy 数组是个好主意,它可以让您的代码更短、更清晰、更易读:

import numpy as np
x = np.array([[int(j) for j in i] for i in list(res.values())])
ans = x.prod(axis=0).sum()
print(ans)

无论 res 中有多少项,上述代码都可以正常工作。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?