访问字典、python 中的值的多键组合

Hongmei Liang

我有这样的字典:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章