
本文介绍如何不依赖 numpy 或 itertools,仅用原生 python 将嵌套字典按“键为行、外层键为列”进行行列转置,并格式化输出为 csv 行结构。
本文介绍如何不依赖 numpy 或 itertools,仅用原生 python 将嵌套字典按“键为行、外层键为列”进行行列转置,并格式化输出为 csv 行结构。
在数据处理中,有时需将“外层键 → 内层键 → 值”的嵌套字典结构(类似宽表)转为“内层键为行索引、外层键为列头”的转置视图,尤其适用于导出 CSV 或对接表格类系统。本例中,原始字典 data_dict 以数字 1, 2, 3 为外层键,每个值是一个含 'One', 'Two', 'three' 的子字典;目标是将其转置为 CSV 行格式:首行为列标题(空字符串 + 外层键),后续每行以子字典键为行头,对应各列数值。
实现核心思路是构建中间转置映射:将原结构中“同一子键(如 'One')在不同外层键下的值”收集为一个列表,从而形成新字典的键值对('One' → [110, 120, 130])。注意需统一子字典的键顺序——本例中所有子字典键一致,故可直接遍历;若存在缺失键,需额外填充(如 None 或默认值),本文暂不涉及该扩展。
以下是完整、可运行的纯 Python 解决方案:
data_dict = {
1: {'One': 110, 'Two': 210, 'three': 310},
2: {'One': 120, 'Two': 220, 'three': 320},
3: {'One': 130, 'Two': 230, 'three': 330}
}
# 步骤1:初始化转置字典,第一行为列标题(空字符串 + 所有外层键)
temp_dict = {"''": list(data_dict.keys())}
# 步骤2:遍历每个子字典,按内层键聚合值
for inner_dict in data_dict.values():
for key, value in inner_dict.items():
temp_dict.setdefault(key, []).append(value)
# 步骤3:按所需顺序输出 CSV 行(建议先固定键顺序,避免字典迭代不确定性)
# 这里按首次出现顺序隐式保证;生产环境推荐显式排序或预定义字段顺序
for row_key, row_values in temp_dict.items():
print(row_key, *row_values, sep=",")✅ 输出结果完全匹配需求:
立即学习“Python免费学习笔记(深入)”;
'',1,2,3 One,110,120,130 Two,210,220,230 three,310,320,330
⚠️ 注意事项:
- setdefault(key, []) 是关键技巧,它确保首次遇到某内层键时创建空列表,后续直接追加,避免 KeyError;
- 若子字典键不完全一致(例如第2个字典缺少 'three'),上述代码会跳过缺失项,导致列长不齐。此时应改用预定义字段列表(如 fields = ['One', 'Two', 'three']),并用 inner_dict.get(field, '') 安全取值;
- print(..., sep=",") 适用于快速调试;实际写入 CSV 文件时,推荐使用标准库 csv 模块(如 csv.writer)以正确处理逗号、引号等转义;
- Python 3.7+ 字典保持插入顺序,因此 temp_dict 的遍历顺序与键插入顺序一致;若需兼容旧版本,可用 collections.OrderedDict 或显式排序键列表。
该方法轻量、可读性强,完美满足“零第三方依赖”的约束,是处理中小型嵌套字典转置任务的推荐实践。










