Получить значение из другого defaultdict и обновить исходный dict - PullRequest
0 голосов
/ 05 апреля 2019

Обычно я пытаюсь извлечь значения из одного словаря и обновить значение в другом словаре.У меня есть четыре списка следующим образом:

a = [1,1,2,3,4,5]
b = [0,3,0,5,6,0]
c = [2,3,4,5,6,5]
d = [20,30,40,50,60,70]

Поэтому я использую defaultdict для хранения пар ключ-значение для a, b, например:

one = defaultdict(list)
for k, v in zip(a, b):
    one[k].append(v)

two = defaultdict(list)
for k, v in zip(c, d):
  two[k].append(v)

По сути, b связан с c так,Я пытаюсь извлечь значения из двух словарей, а затем обновить значения в одном словаре

Таким образом, в конечном итоге выглядело бы как {1: 30, 3: 50, 4: 60}

Это мой код:

three = defaultdict(list)
for k, v in one.items():
  if v in two.keys():
    newvalue = two[v].values()
    three[k].append(newvalue)

Но сейчас я получаю сообщение об ошибке в строке if v in two.keys(): как unhashable type: 'list'.Я так растерялся, все, что я хочу сделать, это использовать значения из одного словаря, а затем использовать эти значения, чтобы найти ключи (которые являются значениями из другой таблицы), а затем получить эти соответствующие значения.

1 Ответ

0 голосов
/ 05 апреля 2019

Вы создаете словарь списка в начале:

one = defaultdict(list)
for k, v in zip(a, b):
    one[k].append(v)

[output] : defaultdict(list, {1: [0, 3], 2: [0], 3: [5], 4: [6], 5: [0]})

two = defaultdict(list)
for k, v in zip(c, d):
    two[k].append(v)

[output] : defaultdict(list, {2: [20], 3: [30], 4: [40], 5: [50, 70], 6: [60]})

Поэтому при вызове k, v в one.items () вы получаете ключ и список. Просто переключитесь на итерацию по списку, и вам будет хорошо идти

three = defaultdict(list)
for k, v in one.items():
    for value in v:
        if value in two.keys():
            newvalue = two[value]
            three[k].append(newvalue)

Однако я получаю этот вывод:

defaultdict(list, {1: [[30]], 3: [[50, 70]], 4: [[60]]})

Что звучит разумно для меня, но это не ваш ожидаемый, не могли бы вы объяснить?

Давайте попробуем узнать с помощью дик-понимания

output = { k : two[v_2] for k,v in one.items() for v_2 in v}

[output] : {1: [30], 2: [], 3: [50, 70], 4: [60], 5: []}

Запрос на сумму:

Конечно, несколько способов сделать это, самый быстрый снова с dict_comprehension и sum

output_sum = {k: sum(v) for k,v in output.items()}
...