Python:如何从文本文件构建同一键对应多值的patients字典?
修复患者字典构建时丢失首个记录的问题
需求与问题描述
需要从文本文件构建名为patients的字典,期望输出格式如下:
{1: [['2022-06-01', 37.2, 72, 16, 120, 80, 97], ['2022-09-15', 37.5, 73, 18, 125, 82, 96]], 2: [['2022-06-10', 36.9, 69, 18, 123, 80, 96], ['2023-01-03', 37.1, 71, 19, 124, 81, 97]], 3: [['2022-08-05', 37.3, 74, 20, 126, 83, 95], ['2023-03-01', 37.4, 75, 18, 123, 79, 98]]}
但当前代码执行后,每个患者ID仅保留最后一条记录,丢失了第一条:
{1: [['2022-09-15', 37.5, 73, 18, 125, 82, 96]], 2: [['2023-01-03', 37.1, 71, 19, 124, 81, 97]], 3: [['2023-03-01', 37.4, 75, 18, 123, 79, 98]]}
问题原因
你的代码大概率是在处理每条记录时,直接用patients[patient_id] = [当前记录]的方式赋值——这会覆盖该ID对应的原有列表,导致每次只保留最后一条记录。正确的逻辑应该是给每个ID维护一个列表,将新记录追加到列表末尾。
解决方案
以下是三种可行的修改方式:
方式1:基础条件判断
先检查患者ID是否在字典中,不存在则初始化空列表,再追加记录:
patients = {} # 假设你已经从文件中读取到每条记录,存在records列表里 for record in records: # 假设每条记录的第一个元素是患者ID,后面是体检数据 patient_id = record[0] exam_data = record[1:] # 初始化空列表(如果ID不存在) if patient_id not in patients: patients[patient_id] = [] # 追加新记录到列表 patients[patient_id].append(exam_data)
方式2:使用字典的setdefault方法
用setdefault简化初始化逻辑,该方法会自动为不存在的键设置默认值(这里是空列表),然后返回该值:
patients = {} for record in records: patient_id = record[0] exam_data = record[1:] # 自动初始化空列表,然后追加记录 patients.setdefault(patient_id, []).append(exam_data)
方式3:使用collections.defaultdict
如果导入标准库的话,defaultdict可以更优雅地实现自动初始化列表:
from collections import defaultdict patients = defaultdict(list) for record in records: patient_id = record[0] exam_data = record[1:] # 直接追加,defaultdict会自动为新ID创建空列表 patients[patient_id].append(exam_data) # 若需要转为普通字典(可选) patients = dict(patients)
以上三种方式都能确保每个患者ID对应的列表会累积所有相关记录,不会覆盖原有数据。
内容的提问来源于stack exchange,提问作者user28
相关产品推荐
相关产品推荐

