Python 字典转置:纯 Python 实现 CSV 格式行列翻转

1次阅读

Python 字典转置:纯 Python 实现 CSV 格式行列翻转

本文介绍如何不依赖 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 构造等下游任务。

text=ZqhQzanResources