我有这样的字典:
d={(('4', '2'), ('2', '0')): [3], (('4', '2'), ('2', '1')): [3], (('4', '2'), ('2', '3')): [1], (('4', '2'), ('2', '4')): [71]}
我的目标是获取一些特殊键的概率,例如,我需要 的概率('4', '2'), ('2', '1')
,即 3/(3+3+1+71)=3/78,但是我如何在 python 中编写这个方法?我有这样的想法:
p={}
for i,j in d.keys():
p[i,j]=d[i,j][0]/sum(d[i][0])
但它没有用,因为 d[I] 不对。
更新:这个问题已经很好地解决了,有一些很好的答案。现在我想问一下如何沿着图中所示的树中的路径进行计算,图片描述了状态之间的转换,我想找到从每个状态到红色状态所需的时间。
这棵树中的每条路径都有两个值,例如 [6,109.0],109.0 是从 ('4','1') 到 ('1','0') 的时间,在这条路径上,从 ('4' )->('4','1')->('1','0') 就是10.0+109.0=119.0,那么问题来了,如何获取当前状态到红色状态的时间呢?
它们之间的转换可以这样写: states_agg={((), ('2',)): [1, 0.0], (('0', '1'), ('1', '4' )): [1, 10.0], (('0', '2'), ('2', '0')): [2, 10.0], (('0', '2'), (' 2', '4')): [1, 159.0], (('0', '4'), ('4', '0')): [26, 13.26923076923077], (('0', ' 4'), ('4', '2')): [2, 10.5],(('1', '2'), ('2', '4')): [4, 71.5], ( ('1', '4'), ('4', '1')): [3, 10.3333333333333334], (('2',), ('2', '0')): [1, 10.0 ], (('2', '0'), ('0', '2')): [1, 42.0], (('2', '0'), ('0', '4') ): [6, 109.0], (('2', '1'), ('1', '2')): [3, 43.0], (('2', '3'), ('3', '2')): [1, 860.0],(('2', '4'), ('4', '2')): [76, -223.8815789473684],(('3', '2'), ('2', '0')): [1, 11.0], (('4 ', '0'), ('0', '1')): [1, 507.0], (('4', '0'), ('0', '2')): [2, 69.5 ],(('4', '0'), ('0', '4')): [23, 200.17391304347825],(('4', '1'), ('1', '2') ): [1, 95.0],(('4', '1'), ('1', '4')): [2, 1447.0], (('4', '2'), ('2 ', '0')): [3, 28.666666666666668] (('4', '2'), ('2', '1'))[3,132.66666666666666], (('4', '2'), ( '2', '3')): [1, 64.0],(('4', '2'),('2', '4')): [71,79.09859154929578]}
例如从 ('4', '2') 到 ('2', '4') 转换时间是 79.09859154929578
CDJB的答案可能正是您所追求的。
但是,如果您的字典中有您不希望用于计算概率(您d[i]
似乎暗示)的键,则需要进行一些调整:
def get_prob_from_key(mykey, dikt):
numer = dikt.get(mykey)
if numer is None:
print(f"Key {mykey} not found! Can't calculate probability")
return None
denom = sum(v[0] for k, v in d.items() if mykey[0] == k[0])
return numer[0]/denom
d={(('4', '2'), ('2', '0')): [3], (('4', '2'), ('2', '1')): [3], (('4', '2'), ('2', '3')): [1], (('4', '2'), ('2', '4')): [71], (('4', '1'), ('1', '2')): [1], (('4', '1'), ('1', '4')): [2],}
k1 = (('4', '2'), ('2', '1'))
k2 = (('4', '2'), ('2', '4'))
k3 = (('5', '2'), ('2', '1'))
k4 = (('4', '1'), ('1', '2'))
get_prob_from_key(k1, d)
> 0.038461538461538464
get_prob_from_key(k2, d)
> 0.9102564102564102
get_prob_from_key(k3, d)
> Key (('5', '2'), ('2', '1')) not found! Can't calculate probability
get_prob_from_key(k4, d)
> 0.3333333333333333
一个警告:
这假设,就像您当前的字典输入一样,所有值都是长度为 1 的列表。如果情况并非总是如此,则需要进行更改。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句