从另一个defaultdict获取值并更新原始dict

时间:2019-04-05 11:17:45

标签: python-3.x defaultdict

基本上,我正在尝试从一个词典中提取值,并在另一本词典中更新值。我有四个列表,如下所示:

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

求和:

当然,有多种实现方法,最快的还是dict_comprehension和sum

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