Комбинации клавиш для доступа к значениям в словаре, python - PullRequest
0 голосов
/ 08 января 2020

У меня есть словарь, подобный этому:

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] не прав.

update: вопрос был хорошо решен с некоторыми хорошими ответами , Теперь я хочу спросить о том, как выполнять вычисления вдоль пути в дереве, показанном на рисунке , на рисунке описаны переходы между состояниями , и я хочу найти время, необходимое для каждого состояния в красные состояния. .

каждый путь в этом дереве имеет два значения, например [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

Ответы [ 2 ]

2 голосов
/ 08 января 2020

Хотите что-то вроде следующего?

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
0 голосов
/ 08 января 2020

Ответом от CDJB может быть то, что вам нужно.

Однако, если в вашем словаре есть ключи, для которых вы не sh будете использовать для вычисления вероятность (которую, по-видимому, подразумевает ваша 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. Если это не всегда так, необходимо внести изменения.

...