Как получить значения из defaultdict, используя новую комбинацию клавиш? - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть следующий defaultdict:

dictA = {"a": {"b": 0.1, "c": 0.2}, "b": {"c": 0.3}}

Исходя из этого, мне нужно добавить значения в список, используя следующую комбинацию клавиш:

order = [("b","b"), ("b","a"), ("b","c"), ("a","b", ("a","a"), ("a","c"), ("c","b"), ("c","a"), ("c","c")]

Если комбинация клавиш одинакова (например, («a», «a»)), значение должно быть равно нулю. Таким образом, конечный результат должен выглядеть примерно так:

result = [0, 0.1, 0.3, 0.1, 0, 0.2, 0.3, 0.2, 0]

Я пробовал следующее

 dist = []
 for index1, member1 in enumerate(order):
    curr = dictA.get(member1, {})
    for index2, member2 in enumerate(order): 
        val = curr.get(member2)
        if member1 == member2:
            val = 0
        if member2 not in curr:
            val = None
        dist.append(val)

Но, очевидно, это не работает, как задумано. Может кто-то помочь мне с этим? Спасибо

1 Ответ

0 голосов
/ 20 ноября 2018

Вы можете сделать что-то вроде этого:

def get(d, first, second):
    return d.get(second, {}).get(first, 0.0)

dictA = {"a": {"b": 0.1, "c": 0.2}, "b": {"c": 0.3}}
order = [("b", "b"), ("b", "a"), ("b", "c"), ("a", "b"), ("a", "a"), ("a", "c"), ("c", "b"), ("c", "a"), ("c", "c")]

result = [get(dictA, first, second) or get(dictA, second, first) for first, second in order]

print(result)

Вывод

[0.0, 0.1, 0.3, 0.1, 0.0, 0.2, 0.3, 0.2, 0.0]

Или менее pythonic альтернатива:

def get(d, first, second):
    return d.get(second, {}).get(first, 0.0)


dictA = {"a": {"b": 0.1, "c": 0.2}, "b": {"c": 0.3}}
order = [("b", "b"), ("b", "a"), ("b", "c"), ("a", "b"), ("a", "a"), ("a", "c"), ("c", "b"), ("c", "a"), ("c", "c")]

result = []
for first, second in order:
    value = get(dictA, first, second)
    if value:
        result.append(value)
    else:
        value = get(dictA, second, first)
        result.append(value)


print(result)

Выход

[0.0, 0.1, 0.3, 0.1, 0.0, 0.2, 0.3, 0.2, 0.0]
...