从另一个defaultdict获取价值并更新原始字典

问题描述 投票:-1回答:1

基本上,我试图从一个字典中提取值并更新另一个字典中的值。我有四个列表如下:

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'的错误。我迷失了,我想要做的就是使用一个字典中的值,然后使用这些值来查找键(这是另一个表中的值),然后获取那些相应的值。

python-3.x defaultdict
1个回答
0
投票

您正在开始创建列表字典:

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

因此,当在one.items()中调用k,v时,您将获得一个键和一个列表。只需切换到遍历列表,你就应该好好去

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

这对我来说听起来很合理,但这不是你想要的,请你解释一下吗?

让我们尝试用dic理解

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: []}

Request to sum :

当然,多种方式,最快的是dict_comprehension和sum

output_sum = {k: sum(v) for k,v in output.items()}
© www.soinside.com 2019 - 2024. All rights reserved.