You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 11:57:40