Python中如何创建嵌套字典并通过新增参数添加元素
问题分析与修正方案
你的代码存在三个核心问题,导致输出不符合预期:
- 字典重复初始化:
d = defaultdict(dict)放在嵌套循环内部,每次循环都会创建新的空字典,之前的键值对全部丢失。 - 提前返回:
return d写在内层循环里,第一次循环(第一个任务+第一个评分项)就直接返回结果,后续循环完全没执行。 - 变量名冲突:两个循环都用
id作为枚举变量,内层的id会覆盖外层值,导致索引逻辑混乱。
修正后的代码
from collections import defaultdict import glob import os.path as opj import numpy as np def mk_dict(tasks, scores, datadir): # 仅初始化一次嵌套字典 result_dict = defaultdict(dict) # 遍历任务列表,用独立索引变量避免冲突 for task_idx, task_name in enumerate(tasks): # 遍历评分项列表 for score_idx, score_name in enumerate(scores): # 匹配当前任务+评分项的所有npy文件 file_paths = glob.glob(opj(datadir, rf"{task_name}\sub-*\*{score_name}.npy")) # 加载对应索引的文件(若需合并所有sub文件,可改用np.array([np.load(f) for f in file_paths])) result_dict[task_name][score_name] = np.load(file_paths[score_idx]) # 所有循环完成后返回完整字典 return result_dict # 避免使用内置函数名dir作为变量名 data_dir = r"C:\Users\....." tasks = ["high", "medium", "low"] scores = ["precision", "accuracy", "f1"] final_dict = mk_dict(tasks, scores, data_dir)
关键优化点
- 将字典初始化移至循环外,确保所有任务和评分项都存入同一个容器。
- 移除循环内的
return语句,让所有迭代逻辑执行完毕后再返回结果。 - 使用不同的枚举变量名(
task_idx/score_idx),避免变量覆盖导致的索引错误。 - 重命名
dir为data_dir,避免与Python内置函数dir()冲突。
内容的提问来源于stack exchange,提问作者Merve
相关产品推荐
相关产品推荐

