我有一个词典列表:
[
{'student_id': 'john', 'exercise_id': '3', 'answer': 20},
{'student_id': 'john', 'exercise_id': '2', 'answer': 10},
{'student_id': 'jane', 'exercise_id': '2', 'answer': 30},
]
将它转换为[exercise x student]“mapping table”字典的优雅/简短方法是什么? 像这样:
{
'3':{
'john': {'student_id': 'john', 'exercise_id': '3', 'answer': 20}
},
'2': {
'john': {'student_id': 'john', 'exercise_id': '2', 'answer': 10},
'jane': {'student_id': 'jane', 'exercise_id': '2', 'answer': 30}
}
}
您可以假设地图每个学生每次练习最多包含一个答案。
答案 0 :(得分:3)
直接的方法是将它们收集在字典中,就像这样
d = {}
for item in l:
d.setdefault(item["exercise_id"], {}).setdefault(item["student_id"], []).append(item)
print(d)
<强>输出强>
{'2': {'jane': [{'answer': 30, 'exercise_id': '2', 'student_id': 'jane'}],
'john': [{'answer': 10, 'exercise_id': '2', 'student_id': 'john'}]},
'3': {'john': [{'answer': 20, 'exercise_id': '3', 'student_id': 'john'}]}}
首先,如果item["exercise_id"]
中没有d
,那么新词典将被设置为值,然后在该词典中,如果item["student_id"]
不存在,我们设置一个空列表作为值,我们将当前字典附加到该列表中。
答案 1 :(得分:2)
这会生成您想要的输出:
output = {}
for value in data:
output.setdefault(value['exercise_id'], {})[value['student_id']] = value
print output