用python中的另一个k/v更新字典

用python中的另一个k/v更新字典,python,dictionary,Python,Dictionary,我不想问这个问题,但我想不出来,这让我很难受 我必须创建一个函数,它接受给定的字典d1,并将其与另一个字典d2进行比较,然后将比较后的值添加到d2 d1已经是我不必担心的格式了。 d2但是,它是一个嵌套字典。看起来是这样的: {’345’: {’Name’: ’xyzzy’, ’ID’: ’345’, ’Responses’: {’Q3’: ’c’, ’Q1’: ’a’, ’Q4’: ’b’, ’Q2’: ’a’}}, ’123’: {’Name’: ’foo’, ’ID’: ’123’, ’R

我不想问这个问题,但我想不出来,这让我很难受

我必须创建一个函数,它接受给定的字典
d1
,并将其与另一个字典
d2
进行比较,然后将比较后的值添加到
d2

d1
已经是我不必担心的格式了。
d2
但是,它是一个嵌套字典。看起来是这样的:

{’345’: {’Name’: ’xyzzy’, ’ID’: ’345’, ’Responses’: {’Q3’: ’c’, ’Q1’: ’a’, ’Q4’: ’b’, ’Q2’: ’a’}},
’123’: {’Name’: ’foo’, ’ID’: ’123’, ’Responses’: {’Q3’: ’c’, ’Q1’: ’a’, ’Q4’: ’a’, ’Q2’: ’b’}},
’234’: {’Name’: ’bar’, ’ID’: ’234’, ’Responses’: {’Q3’: ’c’, ’Q1’: ’a’, ’Q4’: ’b’, ’Q2’: ’b’}}}
因此,
d1
的格式是
Responses
键,这就是我需要从
d2
将其与
d1
进行比较的内容

为此,我隔离了
响应

    for key, i in d2.items():
    temp = i['Responses']
现在,我需要通过一个带有
d1
的函数运行temp,该函数将输出一个整数。然后将该整数与它来自的顶级键匹配,并更新与之关联的新k/v条目。但我不知道怎么做

我已经设法用该比较值更新每个顶级键,但它只对所有顶级键使用第一个比较值。我不知道如何将找到的整数与其键匹配。这是我迄今为止最有效的方法:

    for  i in d2:
        score = grade_student(d1,temp)        #integer
        placement = {'Score': score}
        d2[i].update(placement)

您不必迭代它们。使用内置的
update()
方法。这里有一个例子

>>> A = {'cat':10, 'dog':5, 'rat':50}
>>> B =  {'cat':5, 'dog':10, 'pig':20}
>>> A.update(B) #This will merge the dicts by keeping the values of B if collision
>>> A
{'rat': 50, 'pig': 20, 'dog': 10, 'cat': 5}
>>> B
{'pig': 20, 'dog': 10, 'cat': 5}

您不必迭代它们。使用内置的
update()
方法。这里有一个例子

>>> A = {'cat':10, 'dog':5, 'rat':50}
>>> B =  {'cat':5, 'dog':10, 'pig':20}
>>> A.update(B) #This will merge the dicts by keeping the values of B if collision
>>> A
{'rat': 50, 'pig': 20, 'dog': 10, 'cat': 5}
>>> B
{'pig': 20, 'dog': 10, 'cat': 5}

您可以在
d2
中迭代子字典,并在调用
grade\u student
后更新它们:

for v in d2.values():
    v['Score'] = grade_student(d1, v['Responses'])
下面是一个完整的示例:

import pprint

d1 = {}
d2 = {
    '345': {'Name': 'xyzzy', 'ID': '345', 'Responses': {'Q3': 'c', 'Q1': 'a', 'Q4': 'b', 'Q2': 'a'}},
    '123': {'Name': 'foo', 'ID': '123', 'Responses': {'Q3': 'c', 'Q1': 'a', 'Q4': 'a', 'Q2': 'b'}},
    '234': {'Name': 'bar', 'ID': '234', 'Responses': {'Q3': 'c', 'Q1': 'a', 'Q4': 'b', 'Q2': 'b'}}
}

# Dummy
def grade_student(x, y):
    return 1

for v in d2.values():
    v['Score'] = grade_student(d1, v['Responses'])

pprint.pprint(d2)
输出:

{'123': {'ID': '123',
         'Name': 'foo',
         'Responses': {'Q1': 'a', 'Q2': 'b', 'Q3': 'c', 'Q4': 'a'},
         'Score': 1},
 '234': {'ID': '234',
         'Name': 'bar',
         'Responses': {'Q1': 'a', 'Q2': 'b', 'Q3': 'c', 'Q4': 'b'},
         'Score': 1},
 '345': {'ID': '345',
         'Name': 'xyzzy',
         'Responses': {'Q1': 'a', 'Q2': 'a', 'Q3': 'c', 'Q4': 'b'},
         'Score': 1}}

您可以在
d2
中迭代子字典,并在调用
grade\u student
后更新它们:

for v in d2.values():
    v['Score'] = grade_student(d1, v['Responses'])
下面是一个完整的示例:

import pprint

d1 = {}
d2 = {
    '345': {'Name': 'xyzzy', 'ID': '345', 'Responses': {'Q3': 'c', 'Q1': 'a', 'Q4': 'b', 'Q2': 'a'}},
    '123': {'Name': 'foo', 'ID': '123', 'Responses': {'Q3': 'c', 'Q1': 'a', 'Q4': 'a', 'Q2': 'b'}},
    '234': {'Name': 'bar', 'ID': '234', 'Responses': {'Q3': 'c', 'Q1': 'a', 'Q4': 'b', 'Q2': 'b'}}
}

# Dummy
def grade_student(x, y):
    return 1

for v in d2.values():
    v['Score'] = grade_student(d1, v['Responses'])

pprint.pprint(d2)
输出:

{'123': {'ID': '123',
         'Name': 'foo',
         'Responses': {'Q1': 'a', 'Q2': 'b', 'Q3': 'c', 'Q4': 'a'},
         'Score': 1},
 '234': {'ID': '234',
         'Name': 'bar',
         'Responses': {'Q1': 'a', 'Q2': 'b', 'Q3': 'c', 'Q4': 'b'},
         'Score': 1},
 '345': {'ID': '345',
         'Name': 'xyzzy',
         'Responses': {'Q1': 'a', 'Q2': 'a', 'Q3': 'c', 'Q4': 'b'},
         'Score': 1}}

我确实试过了,但它只更新了3个顶级键中的1个。这就是我尝试迭代的原因。实际上它没有更新其中一个键,它实际上只是添加了另一个与键分开的k/v项。我确实尝试过,但它只更新了3个顶级键中的1个。这就是我尝试迭代的原因。实际上它并没有更新其中一个键,它实际上只是添加了另一个与键分开的k/v项。我知道我不应该使用这些注释来表示感谢,但该死的,谢谢你。我知道我不应该用这些评论来表示感谢,但我的天啊,谢谢你。我从没想过要这么做。