首页 > 解决方案 > 用于访问字典、python 中的值的多键组合

问题描述

我有这样的字典:

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.333333333333334], (('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

标签: pythondictionary

解决方案


你想要类似下面的东西吗?

d={(('4', '2'), ('2', '0')): [3],
   (('4', '2'), ('2', '1')): [3],
   (('4', '2'), ('2', '3')): [1],
   (('4', '2'), ('2', '4')): [71]}

s = sum(v[0] for v in d.values())

p = {k: v[0]/s for k, v in d.items()}

这给了我们:

>>> p
{(('4', '2'), ('2', '0')): 0.038461538461538464,
 (('4', '2'), ('2', '1')): 0.038461538461538464,
 (('4', '2'), ('2', '3')): 0.01282051282051282,
 (('4', '2'), ('2', '4')): 0.9102564102564102}

从评论中回答问题 - 我怎样才能得到以 ('4', '1') 开头的键的概率,d如下所示:

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],}

然后我们可以在 上使用列表推导p

>>> [v for k, v in p.items() if k[0] == ('4', '1')]
[0.012345679012345678, 0.024691358024691357]

如果我们想要这些键的总概率:

>>> sum(v for k, v in p.items() if k[0] == ('4', '1'))
0.037037037037037035

推荐阅读