您链接的答案中提供的解决方案是正确的,但您必须以特定方式将它们放在一起以获得您想要的结果:
from itertools import groupby
data = [
{'date': '2020-02-02', 'id': '1', 'dept': '20020', 'CNT': '1', 'rep_level': 'form1'},
{'date': '2020-02-02', 'id': '1', 'dept': '20020', 'CNT': '0', 'rep_level': 'form2'},
{'date': '2020-02-02', 'id': '1', 'dept': '20020', 'CNT': '4', 'rep_level': 'form3'},
{'date': '2020-02-02', 'id': '2', 'dept': '20020', 'CNT': '9', 'rep_level': 'all'},
{'date': '2020-02-02', 'id': '3', 'dept': '20021', 'CNT': '14', 'rep_level': 'all'},
{'date': '2020-02-02', 'id': '1', 'dept': '20022', 'CNT': '5', 'rep_level': 'form1'},
{'date': '2020-02-02', 'id': '1', 'dept': '20022', 'CNT': '2', 'rep_level': 'form2'},
{'date': '2020-02-02', 'id': '1', 'dept': '20022', 'CNT': '3', 'rep_level': 'form3'}
]
result = [{
'dept': dept,
'answers': [{
'id': identifier,
'answerValue': [int(a['CNT']) for a in answers]
} for identifier, answers in groupby(results, key=lambda x: x['id'])]
} for dept, results in groupby(data, key=lambda x: x['dept'])]
在里面,有:
'answerValue': [int(a['CNT']) for a in answers]
'CNT'
它从in的字符串值构造答案整数值answers
的列表,作为列表推导。
这answers
来自它周围的表达式:
'answers': [{
'id': identifier,
'answerValue': [int(a['CNT']) for a in answers]
} for identifier, answers in groupby(results, key=lambda x: x['id'])]
这是另一种列表理解,在调用 之后,为 的每个值创建一个字典,identifier
并在字段上进行分组。answers
groupby()
results
'id'
这results
来自外在的理解:
result = [{
'dept': dept,
'answers': [{
'id': identifier,
'answerValue': [int(a['CNT']) for a in answers]
} for identifier, answers in groupby(results, key=lambda x: x['id'])]
} for dept, results in groupby(data, key=lambda x: x['dept'])]
这与上一个类似,将原始data
按分组'dept'
并为每个部门创建一个字典并为其results
分组。
如果您print(result)
:
[{'dept': '20020', 'answers': [{'id': '1', 'answerValue': [1, 0, 4]}, {'id': '2', 'answerValue': [9]}]}, {'dept': '20021', 'answers': [{'id': '3', 'answerValue': [14]}]}, {'dept': '20022', 'answers': [{'id': '1', 'answerValue': [5, 2, 3]}]}]
这就是你所追求的结果。如果您愿意,您当然可以添加日期,但您表示这始终是相同的。
注意:就个人而言,我认为这是做类似事情的更有用的方法:
result = {
dept: {
identifier: [int(a['CNT']) for a in answers]
for identifier, answers in groupby(results, key=lambda x: x['id'])
}
for dept, results in groupby(data, key=lambda x: x['dept'])
}
这会让你(打印时):
{'20020': {'1': [1, 0, 4], '2': [9]}, '20021': {'3': [14]}, '20022': {'1': [5, 2, 3]}}
你可以像这样访问它:
print(result['20020']['2']) # prints "[9]"