如何合并列表中含相同元素的字典?Python实现求助
Python字典列表按
New_PCP_Name分组合并 我来帮你搞定这个字典列表的合并问题!你的需求是按New_PCP_Name字段分组,把同一个医生下的患者信息合并成列表,单个患者的话保持原结构对吧?咱们一步步来解决:
一、处理现有字典列表的解决方案
你的尝试是逐个比较相邻元素,但这种方法没法处理超过两个相同分组的情况,而且逻辑不够完善。咱们换个思路:先用一个临时字典按New_PCP_Name分组收集数据,再转换成你需要的格式。
完整代码示例
# 你的原始数据 data = [ {'New_PCP_Name': 'Jack0', 'Member_Name': 'Jack0, 0', 'Member_ID': '111', 'DOB': '111', 'PCP_ID':'111'}, {'New_PCP_Name': 'Jack0', 'Member_Name': 'Jack00, 00', 'Member_ID': '222', 'DOB': '222', 'PCP_ID':'111'}, {'New_PCP_Name': 'Jack1', 'Member_Name': 'Jack1, 1', 'Member_ID': '333', 'DOB': '333', 'PCP_ID':'333'}, {'New_PCP_Name': 'Jack2', 'Member_Name': 'Jack2, 2', 'Member_ID': '444', 'DOB': '444', 'PCP_ID':'444'} ] # 第一步:按New_PCP_Name分组收集数据 grouped = {} for item in data: pcp_name = item['New_PCP_Name'] pcp_id = item['PCP_ID'] # 提取患者相关的信息 member_info = { 'Member_Name': item['Member_Name'], 'Member_ID': item['Member_ID'], 'DOB': item['DOB'] } # 如果该医生还没在分组字典里,初始化条目 if pcp_name not in grouped: grouped[pcp_name] = { 'New_PCP_Name': pcp_name, 'PCP_ID': pcp_id, 'Member_Name': [] } # 将患者信息加入对应医生的列表 grouped[pcp_name]['Member_Name'].append(member_info) # 第二步:转换成你需要的最终格式 result = [] for group in grouped.values(): # 如果只有一个患者,把成员信息展开到外层字典 if len(group['Member_Name']) == 1: single_member = group['Member_Name'][0] merged_item = { 'New_PCP_Name': group['New_PCP_Name'], 'PCP_ID': group['PCP_ID'], **single_member # 展开单个患者的键值对 } result.append(merged_item) # 多个患者保持列表格式 else: result.append(group) # 打印结果看看是否符合要求 import pprint pprint.pprint(result)
代码说明
- 分组收集:用
grouped字典作为容器,键是医生姓名,值是包含医生ID和患者列表的字典,这样能高效地把同一医生的患者归到一起。 - 格式转换:遍历分组后的结果,判断每个医生的患者数量:
- 单个患者时,把患者的信息直接合并到外层字典,保持你要的原结构;
- 多个患者时,保留患者列表的格式。
运行这段代码后,输出的result就是你想要的目标格式啦!
二、从Excel导入时直接生成目标格式
如果你是从Excel读取数据,可以用pandas库来简化流程,直接在导入后分组处理:
代码示例
import pandas as pd import pprint # 读取Excel文件(假设你的Excel文件名为data.xlsx,数据在第一个工作表) df = pd.read_excel('data.xlsx') # 按New_PCP_Name分组,处理每个组 result = [] for pcp_name, group_df in df.groupby('New_PCP_Name'): # 获取医生ID(同一医生的PCP_ID应该相同,取第一个即可) pcp_id = group_df['PCP_ID'].iloc[0] # 把每组的患者信息转换成字典列表 member_list = group_df[['Member_Name', 'Member_ID', 'DOB']].to_dict('records') # 按患者数量生成对应格式的字典 if len(member_list) == 1: merged_item = { 'New_PCP_Name': pcp_name, 'PCP_ID': pcp_id, **member_list[0] } result.append(merged_item) else: result.append({ 'New_PCP_Name': pcp_name, 'PCP_ID': pcp_id, 'Member_Name': member_list }) # 查看结果 pprint.pprint(result)
注意事项
- 确保Excel里的列名和你字典里的键完全一致(比如
New_PCP_Name、Member_Name等); - 如果还没安装
pandas和openpyxl(用于读取Excel),可以用命令pip install pandas openpyxl安装。
内容的提问来源于stack exchange,提问作者user11809703
相关产品推荐
相关产品推荐

