如何利用字典列表,根据文本/CSV文件数据动态更新对应字典?
嘿,我完全懂你遇到的麻烦——随着合作诊所数量蹭蹭涨,那串if-elif链肯定会变得又长又乱,维护起来简直头疼。咱们换个更灵活、更易扩展的思路来解决这个问题!
核心思路:用字典映射替代条件判断链
与其写一堆if clinic_code == XXX,不如直接把诊所代码和对应的目标字典绑定成一个映射字典。这样你不用提前知道每个字典的名字,只要拿到诊所代码,就能直接找到要更新的字典,完全动态化。
先给你举个具体的实现例子,对照你原来的场景来改:
原来的臃肿写法(反面教材)
# 一堆零散的诊所字典 clinic_x_data = {"total_cases": 0, "test_types": []} clinic_y_data = {"total_cases": 0, "test_types": []} clinic_z_data = {"total_cases": 0, "test_types": []} # ... 新增诊所就得再加一行字典定义 # CSV处理逻辑里的长长条件链 import csv with open('lab_records.csv', 'r') as f: reader = csv.reader(f) next(reader) # 跳过表头 for row in reader: clinic_code = row[2] if clinic_code == "CLINIC_X": clinic_x_data["total_cases"] += 1 clinic_x_data["test_types"].append(row[4]) elif clinic_code == "CLINIC_Y": clinic_y_data["total_cases"] += 1 clinic_y_data["test_types"].append(row[4]) elif clinic_code == "CLINIC_Z": clinic_z_data["total_cases"] += 1 clinic_z_data["test_types"].append(row[4]) # ... 每加一个诊所就得加一个elif
改进后的优雅写法
import csv # 把所有诊所字典统一放到一个映射表里 clinic_dict_mapping = { "CLINIC_X": {"total_cases": 0, "test_types": []}, "CLINIC_Y": {"total_cases": 0, "test_types": []}, "CLINIC_Z": {"total_cases": 0, "test_types": []}, # 新增诊所?直接在这里加一行键值对就行,不用碰下面的逻辑! } with open('lab_records.csv', 'r') as f: reader = csv.reader(f) next(reader) for row in reader: clinic_code = row[2] # 动态找到对应的字典,不用写判断! if clinic_code in clinic_dict_mapping: target_dict = clinic_dict_mapping[clinic_code] target_dict["total_cases"] += 1 target_dict["test_types"].append(row[4]) else: # 可选:处理未知诊所代码的情况,比如打日志提醒 print(f"警告:发现未注册的诊所代码 {clinic_code}")
进阶:如果不同诊所的更新逻辑不一样怎么办?
要是有的诊所需要特殊处理(比如累加数值不是1,或者要记录不同的字段),可以把映射表里的值改成「更新函数+字典」的组合,让逻辑更灵活:
# 定义不同诊所的更新逻辑函数 def update_clinic_x(row, target_dict): target_dict["total_cases"] += 1 target_dict["blood_tests"].append(row[4]) def update_clinic_y(row, target_dict): # Y诊所需要累加样本数量,不是计数 target_dict["total_samples"] += int(row[5]) target_dict["urine_tests"].append(row[6]) # 映射表现在绑定代码到「函数+字典」 clinic_logic_mapping = { "CLINIC_X": (update_clinic_x, {"total_cases": 0, "blood_tests": []}), "CLINIC_Y": (update_clinic_y, {"total_samples": 0, "urine_tests": []}), } with open('lab_records.csv', 'r') as f: reader = csv.reader(f) next(reader) for row in reader: clinic_code = row[2] if clinic_code in clinic_logic_mapping: update_func, target_dict = clinic_logic_mapping[clinic_code] update_func(row, target_dict)
这种方式下,每个诊所的更新逻辑可以独立维护,新增诊所只需要加一个函数和一行映射,完全不影响原有代码。
为什么这个方案更好?
- 扩展性拉满:新增诊所只需要修改映射表,不用动循环逻辑
- 可读性更高:一眼就能看到所有诊所和对应的数据/逻辑
- 彻底摆脱条件链:再也不用面对几十行的if-elif了
内容的提问来源于stack exchange,提问作者dissemin8or
相关产品推荐
相关产品推荐

