Python:将列表转换为二维映射字典

时间:2014-10-22 13:07:57

标签: python dictionary

我有一个词典列表:

[
    {'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}
    }
}

您可以假设地图每个学生每次练习最多包含一个答案。

2 个答案:

答案 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