我不想问这个问题,但是我不明白,这让我很困扰。
我必须创建一个函数,它接受给定的字典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
进行比较的内容。
所以我隔离responses
:
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)
你可以在d2
中迭代子字典,并在调用grade_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}}
您不必迭代它们。使用内置的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}