如何在Python中实现Dict[str:array[int]]转Array[Dict[str:int]]?
解决Python中字典到列表字典的格式转换问题
方法1:使用zip() + 列表推导式
这是最简洁的实现方式,利用zip()将各键对应列表的元素按位置配对,再逐个生成字典:
original_dict = {'A': [1, 2, 3], 'B': [4, 5, 6]} result = [{key: val for key, val in zip(original_dict.keys(), items)} for items in zip(*original_dict.values())] print(result) # 输出: [{'A': 1, 'B': 4}, {'A': 2, 'B': 5}, {'A': 3, 'B': 6}]
如果需要更直观的写法,可以先提取键列表,再遍历打包后的元素:
keys = list(original_dict.keys()) values = zip(*original_dict.values()) result = [{keys[i]: v for i, v in enumerate(item)} for item in values]
方法2:正确的循环实现(避免引用覆盖)
你遇到的「结果仅保留最后一项」问题,大概率是循环中重复修改同一个字典对象,再多次添加到列表导致的。比如错误写法如下:
# 错误示例:复用同一个字典对象 original_dict = {'A': [1, 2, 3], 'B': [4, 5, 6]} result = [] temp_dict = {} for a, b in zip(original_dict['A'], original_dict['B']): temp_dict['A'] = a temp_dict['B'] = b result.append(temp_dict) print(result) # 输出: [{'A': 3, 'B': 6}, {'A': 3, 'B': 6}, {'A': 3, 'B': 6}]
问题核心是列表中保存的是字典的引用,每次修改temp_dict都会同步改变列表里的所有元素。正确做法是每次循环创建新字典:
original_dict = {'A': [1, 2, 3], 'B': [4, 5, 6]} result = [] # 按位置遍历对应元素对 for a_val, b_val in zip(original_dict['A'], original_dict['B']): result.append({'A': a_val, 'B': b_val}) print(result) # 输出: [{'A': 1, 'B': 4}, {'A': 2, 'B': 5}, {'A': 3, 'B': 6}]
如果字典的键不固定(比如可能有多个键),可以用通用循环写法:
original_dict = {'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]} result = [] keys = list(original_dict.keys()) # 按位置打包所有值列表 for values in zip(*original_dict.values()): new_dict = {} for key, val in zip(keys, values): new_dict[key] = val result.append(new_dict) print(result) # 输出: [{'A':1,'B':4,'C':7}, {'A':2,'B':5,'C':8}, {'A':3,'B':6,'C':9}]
关键注意点
- 确保所有值列表长度一致,
zip()默认只会处理到最短列表的长度。若需处理长度不一致的情况,可使用itertools.zip_longest()并指定缺失值的默认值。 - 循环中必须每次创建新字典,而非修改同一个字典后重复添加,否则列表中保存的都是同一字典的引用,最终结果会被最后一次修改覆盖。
内容的提问来源于stack exchange,提问作者user2607381
相关产品推荐
相关产品推荐

