如何用Python将字典列表按key分组导出为指定格式CSV文件?
Python 按字典key分组并生成指定格式CSV文件
问题描述
现有如下结构的字典列表:
listofdictionaries = [{'key1': ('A', 'B', 'C'), 'key2':[1, 2, 3]}, {'key1': ('AA', 'BB', 'CC'), 'key2':[1, 2, 3]}, {'key1': ('AAA', 'BBB', 'CCC'), 'key2':[4, 5, 6]}]
需要按key2的值分组,将相同key2对应的key1值归为一组,生成如下格式的表格并输出为CSV文件:
| Group 1 | Group 1 Items | Group 2 | Group 2 Items |
|---|---|---|---|
| [1,2,3] | (A,B,C) | [4,5,6] | (AAA,BBB,CCC) |
| (AA,BB,CC) |
解决方案
步骤1:分组处理数据
使用collections.defaultdict按key2的值对key1进行分组,由于列表不可哈希,需将key2转换为元组作为字典的键。
步骤2:构建CSV行数据
确定分组后最长的元素列表长度,以此为基准生成每一行数据:第一行显示分组的key2值,后续行对应位置留空;每个分组的key1值依次填充,不足的位置留空。
完整代码实现
from collections import defaultdict import csv # 原始数据 listofdictionaries = [{'key1': ('A', 'B', 'C'), 'key2':[1, 2, 3]}, {'key1': ('AA', 'BB', 'CC'), 'key2':[1, 2, 3]}, {'key1': ('AAA', 'BBB', 'CCC'), 'key2':[4, 5, 6]}] # 按key2分组,将列表转成元组作为键 groups = defaultdict(list) for item in listofdictionaries: key_tuple = tuple(item['key2']) groups[key_tuple].append(item['key1']) # 将分组转为有序列表,确保Group 1、Group 2的顺序 group_list = list(groups.items()) # 确定需要生成的最大行数 max_row_count = max(len(items) for _, items in group_list) # 构建表头 header = [] for i in range(len(group_list)): header.append(f"Group {i+1}") header.append(f"Group {i+1} Items") # 构建每一行的数据 csv_rows = [] for row_idx in range(max_row_count): current_row = [] for group_key, group_items in group_list: # 分组列:仅第一行显示key,其余行留空 current_row.append(str(group_key) if row_idx == 0 else "") # 分组项列:有对应元素则填充,否则留空 current_row.append(str(group_items[row_idx]) if row_idx < len(group_items) else "") csv_rows.append(current_row) # 写入CSV文件 with open('grouped_output.csv', 'w', newline='', encoding='utf-8') as csv_file: writer = csv.writer(csv_file) writer.writerow(header) writer.writerows(csv_rows)
输出效果
运行代码后会生成grouped_output.csv文件,用表格工具打开后将呈现需求中的格式,原始CSV内容如下:
Group 1,Group 1 Items,Group 2,Group 2 Items "(1, 2, 3)","('A', 'B', 'C')","(4, 5, 6)","('AAA', 'BBB', 'CCC')" ,"('AA', 'BB', 'CC')",,
内容的提问来源于stack exchange,提问作者Sanjiv Prasad
相关产品推荐
相关产品推荐

