
本文介绍如何不依赖 numpy 或 itertools,仅用原生 python 将嵌套字典按“外层键为列、内层键为行”完成转置,并输出符合要求的 csv 格式字符串。
本文介绍如何不依赖 numpy 或 itertools,仅用原生 python 将嵌套字典按“外层键为列、内层键为行”完成转置,并输出符合要求的 csv 格式字符串。
在数据处理中,常需将「以样本 ID 为外键、特征名为内键」的嵌套字典(类似宽表结构)转置为「特征名作行索引、ID 作列索引」的 CSV 表格格式。本例中,原始字典 data_dict 的结构为:
data_dict = {
1: {'One': 110, 'Two': 210, 'three': 310},
2: {'One': 120, 'Two': 220, 'three': 320},
3: {'One': 130, 'Two': 230, 'three': 330}
}目标是生成如下 CSV 字符串(注意首行为空字符串 '' + 所有外层键,后续每行为一个内层键及其对应各列值):
'',1,2,3 One,110,120,130 Two,210,220,230 three,310,320,330
核心思路是构建一个临时字典 temp_dict,其中:
- 键为最终 CSV 的行头(即内层键,如 'One';另加特殊键 "''" 表示首行);
- 值为对应位置的数值列表(长度等于外层键数量,顺序与 data_dict.keys() 一致)。
以下是简洁、可读性强的纯 Python 实现:
立即学习“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 行(推荐先确定行序,避免字典无序导致结果不稳定)
# 这里我们以 "''" 开头,其余行按原始内层键首次出现顺序排列(或按字母序更稳妥)
# 为确保稳定,显式定义行顺序(取第一个样本的 keys 作为基准)
if data_dict:
first_inner_keys = next(iter(data_dict.values())).keys()
row_order = ["''"] + list(first_inner_keys)
else:
row_order = ["''"]
# 输出
for row_key in row_order:
if row_key in temp_dict:
print(row_key, *temp_dict[row_key], sep=",")✅ 输出结果:
'',1,2,3 One,110,120,130 Two,210,220,230 three,310,320,330
⚠️ 注意事项:
- Python 3.7+ 中字典保持插入顺序,但为兼容性和逻辑清晰,建议显式控制 row_order(如上所示),而非依赖 temp_dict.keys() 的遍历顺序;
- 若不同样本的内层键不完全一致(存在缺失或新增字段),需额外做对齐处理(例如用 None 或默认值填充),本例假设结构一致;
- 如需写入文件而非打印,可将 print(...) 替换为 f.write(...),并注意添加换行符;
- 此方案时间复杂度为 O(N×M),N 为外层数量,M 为平均内层键数,空间复杂度 O(N×M),高效且无第三方依赖。
掌握该模式后,可轻松扩展至导出 CSV 文件、生成 Markdown 表格或对接 pandas DataFrame 构造等下游任务。










