如何基于公共键值迭代并合并多个Python字典?
解决字典列表按
'i'键合并、以'id'为新键的问题 需求明确:将列表中所有'i'键值相同的字典合并,合并后保留'i'键,同时把原字典的'id'作为新键,对应的'value'作为新键的值。
输入示例
input_list = [ {'i': 1, 'id': 'a', 'value': 10}, {'i': 1, 'id': 'b', 'value': 20}, {'i': 2, 'id': 'a', 'value': 30}, {'i': 2, 'id': 'c', 'value': 40}, {'i': 3, 'id': 'd', 'value': 50}, {'i': 1, 'id': 'a', 'value': 15} # 同一i下重复id,取最后一个值 ]
期望输出示例
output_list = [ {'i': 1, 'a': 15, 'b': 20}, {'i': 2, 'a': 30, 'c': 40}, {'i': 3, 'd': 50} ]
常见错误代码示例(仅处理部分情况)
这类代码通常因遍历效率低或逻辑漏洞,导致重复创建条目或遗漏合并:
# 错误示例:遍历结果列表查找匹配项,易出现重复添加问题 result = [] for item in input_list: matched = None for res in result: if res['i'] == item['i']: matched = res break if matched: matched[item['id']] = item['value'] else: # 错误地直接修改原字典并添加,若同一i后续出现会重复创建 new_item = item.copy() new_item[new_item['id']] = new_item['value'] del new_item['id'], new_item['value'] result.append(new_item)
正确实现方法
用临时字典按'i'值分组,高效完成合并,最后转为列表即可:
def merge_dicts_by_i(input_list): merged_groups = {} for item in input_list: i_value = item['i'] # 初始化该i值对应的合并字典 if i_value not in merged_groups: merged_groups[i_value] = {'i': i_value} # 将当前条目的id和value加入合并字典 merged_groups[i_value][item['id']] = item['value'] # 将分组字典的值转为列表,得到最终结果 return list(merged_groups.values()) # 测试执行 input_list = [ {'i': 1, 'id': 'a', 'value': 10}, {'i': 1, 'id': 'b', 'value': 20}, {'i': 2, 'id': 'a', 'value': 30}, {'i': 2, 'id': 'c', 'value': 40}, {'i': 3, 'id': 'd', 'value': 50}, {'i': 1, 'id': 'a', 'value': 15} ] print(merge_dicts_by_i(input_list)) # 输出:[{'i': 1, 'a': 15, 'b': 20}, {'i': 2, 'a': 30, 'c': 40}, {'i': 3, 'd': 50}]
逻辑说明
- 临时字典
merged_groups以原字典的'i'值为键,确保每个'i'只对应一个合并后的字典,避免重复。 - 遍历输入时,若当前
'i'已存在分组,直接追加id: value键值对;若不存在则初始化包含'i'键的新字典。 - 同一
'i'下出现重复'id'时,后续的'value'会覆盖前面的值,符合常规合并逻辑。
内容的提问来源于stack exchange,提问作者Srichard90
相关产品推荐
相关产品推荐

