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

访问字典中的值的多键组合,python,python,dictionary,Python,Dictionary,我有这样的字典: d={(('4', '2'), ('2', '0')): [3], (('4', '2'), ('2', '1')): [3], (('4', '2'), ('2', '3')): [1], (('4', '2'), ('2', '4')): [71]} p={} for i,j in d.keys(): p[i,j]=d[i,j][0]/sum(d[i][0]) 我的目标是获得某些特殊键的概率,例如,我需要('4','2'),('2','1'),即3/(

我有这样的字典:

d={(('4', '2'), ('2', '0')): [3], (('4', '2'), ('2', '1')): [3], (('4', '2'), ('2', '3')): [1], (('4', '2'), ('2', '4')): [71]}
p={}
for i,j in d.keys():
    
    p[i,j]=d[i,j][0]/sum(d[i][0])
我的目标是获得某些特殊键的概率,例如,我需要
('4','2'),('2','1')
,即3/(3+3+1+71)=3/78的概率,但是如何用python编写此方法呢? 我有这样的想法:

d={(('4', '2'), ('2', '0')): [3], (('4', '2'), ('2', '1')): [3], (('4', '2'), ('2', '3')): [1], (('4', '2'), ('2', '4')): [71]}
p={}
for i,j in d.keys():
    
    p[i,j]=d[i,j][0]/sum(d[i][0])
但它不起作用,因为d[I]是不对的

更新: 这个问题已经很好地解决了,有一些很好的答案。现在我想问一下如何沿着图中所示的树中的路径进行计算,我想找到从每个状态到红色状态所需的时间

此树中的每个路径都有两个值,例如[6109.0],109.0是从('4','1')到('1','0')的时间,在这条路径上,从('4')->('4','1')->('1','0')是10.0+109.0=119.0,所以问题是如何获得从当前状态到红色状态的时间

它们之间的转换可以这样写: 州:1,0.0,('0','1'),('1','4'):[1,10.0],('0','2'),('2','0'):[2,10.0],('0','2'),('2','2'),('2','4'):[1,159.0],('0','4'),('4','4','0'):[26,13.269223076923077], (('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","2","1","4","2","1","2"","1",""2","2","2"


例如,从('4','2')到('2','4')的转换时间是79.09859154929578

您想要以下内容吗

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
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的列表。如果情况并非总是如此,则需要进行更改。

为什么可能性如此?我不确定我是否完全理解你的逻辑?你的第二个问题的答案不就是-
transition\u time=states\u agg[(('4','2'),('2','4'))][1]
?不,transition\u time=states\u agg[('4','2'),('2','4')][1]只是从('4','2','4')到('2','4')的时间,我需要整个路径的过渡时间,例如,从开始节点('0','1')到目标节点:('0','1'),('1','4'))->('4','1'),('1','2'))->('2','0'),('0','4'))和('0','4')作为目标节点,应该添加此路径的转换时间。如果我将以“4”结尾的状态命名为目标,并在此字典中找到指向以“4”结尾的节点的所有路径,是否可能?把每一条路径的过渡时间加起来?我不清楚你们是如何选择这条路径的?从你的曲线图上看,我可以(0,1)-->(1,4)-->(4,0)。除此之外,我认为对于这个字典结构和键结构,您的操作现在可能变得有点复杂。我对python中的网络了解不多,但您可能会看到这样的东西,它似乎适合您的用例谢谢,似乎是这样:)谢谢,这正是我想要的。但是如果字典是这样的: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','4'):[2],},我如何得到以('4','1','1','4'):[2]开头的键的概率呢,?我的答案中的函数可能有助于实现这一点。多亏了大家,也许我在我的评论中不是很清楚,我需要以相同元组开始的每个元素的概率,例如:('4','1'),('1','2')的概率是1/(1+2);概率('4','2'),('2','1'),即3/(3+3+1+71)=3/78,以不同元组开始的概率计算应分别计算。有可能我在字典中添加了一个额外的键:非常感谢,我从未想到这个网站会如此有用,我应该早点说:)有没有可能我给字典加了一个额外的键(('0','2','0'):[2,10.0],所以d现在看起来像是d={('4','2'),('2','0'):[3],('4','2'),('2','1'):[3],('4','2','3'):[1],('4','2','2'),('2','4'):[71],('0','2','10]),我想这个新增加的单个元素的概率是0?根据get_prob_from_key方法,此新添加的概率应为1。但是我认为这个元素是安全的,所有其他的转换都很关键,请你说清楚一点好吗?是否希望函数为键“('0','2'),('2','0')”输出
0
?它的逻辑是什么,在它的值列表中有两个元素,为什么会这样,这会如何影响其他情况?也许你可以为这个问题提供更多的上下文,比如是什么生成了这些值?在我的例子中,元组以('4','2')开始是临界状态,元组以其他事物开始都是安全状态,对于所有安全状态,我希望它们的输出为'0',对于临界状态,计算概率是有意义的,但对于安全状态,我们可以简单地说是ou