Python使用groupby之字典分组


需求:根据列表中字段元素某个(些)字段分组

解决方案: functiontools中groupby函数进行分组,使用这个函数前必须先要排序,可通过使用operator 模块的itemgetter 函数,可以非常容易的排序这样的数据结构。

 1 data=[
 2 
 3   {'id': '078af4a6228047dba0' , 'main_code': 'TJ' , 'code': 'XC001' , ‘groupid’: 0 , 'column_name': 'name' , 'column_value': '张三'},
 4 
 5   {'id': '078af4a6228047dba0' , 'main_code': 'TJ', 'code': 'XC001' , ‘groupid’: 0, 'column_name': 'age' , 'column_value': '27'},
 6 
 7   {'id':'078af4a6228047dba0', 'main_code': 'TJ','code':'XC001',‘groupid’:1,'column_name':'name','column_value':'李四'},
 8 
 9   {'id':'078af4a6228047dba0', 'main_code': 'TJ','code':'XC001',‘groupid’:1,'column_name':'age','column_value':'45'},
10 
11   {'id': '078af4a6228047dba0' , 'main_code': 'LP' , 'code': 'XC001' , ‘groupid’: 0 , 'column_name': 'name' , 'column_value': '张三'},
12 
13   {'id': '078af4a6228047dba0' , 'main_code': 'LP', 'code': 'XC001' , ‘groupid’: 0, 'column_name': 'age' , 'column_value': '27'},
14 
15   {'id':'078af4a6228047dba0', 'main_code': 'LP','code':'XC001',‘groupid’:1,'column_name':'name','column_value':'李四'},
16 
17   {'id':'078af4a6228047dba0', 'main_code': 'LP','code':'XC001',‘groupid’:1,'column_name':'age','column_value':'45'},
18 
19   {'id':'078af4a6228047dba0', 'main_code': 'TJ','code':'RY002',‘groupid’:0,'column_name':'sex','column_value':''},
20 
21   {'id':'82970de3e3b836d34', 'main_code': 'TJ','code':'BD001',‘groupid’:0,'column_name':'isEnable','column_value':True}
22 
23 ]
24 
25 from operator import itemgetter
26 from itertools import groupby
27 import json
28 data.sort(key=itemgetter('id'))
29 datas = []
30 # id分组
31 for id, items in groupby(data, key=itemgetter('id')):
32     data_dict = {'id': id}
33     for code_info, item in groupby(items, key=itemgetter('main_code','code')):
34         if code_info[0]:
35             column=[]
36             list_item=[i for i in item]
37             list_item.sort(key=itemgetter('groupid'))
38             for group_id,g_item in groupby(list_item,key=itemgetter('groupid')):
39                 column_dict = {}
40                 for gi in g_item:
41                     column_dict[gi.get('column_name')] = gi.get('column_value')
42                 column_dict['group_id'] = group_id
43                 column.append(column_dict)
44                 data_dict[f'{code_info[0]}{code_info[1]}'] = column if len(column)>1 else column[0]
45         else:
46             data_dict[f'{code_info[0]}{code_info[1]}'] = '无数据'
47     datas.append(data_dict)
48 print(json.dumps(datas,ensure_ascii=False))
View Code

 

 博友有其他方案,不吝赐教...


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM