Python中合并字典列表:键值不同存列表,相同保留单个值
字典列表合并:相同值保留单个,不同值存列表
需求回顾
给定字典列表:
lst = [{'A':1,'B':2,'C':4},{'A':2,'B':2,'C':4},{'A':3,'B':2,'C':4}]
需要合并为单个字典:键对应的值若全部相同则保留单个值,若存在不同则存入列表,期望输出:
{'A':[1,2,3],'B':2,'C':4}
实现方案
核心思路是先收集所有键对应的全部值,再判断值是否一致,决定最终存储形式:
步骤1:收集所有键对应的值
用临时字典存储每个键的所有值:
lst = [{'A':1,'B':2,'C':4},{'A':2,'B':2,'C':4},{'A':3,'B':2,'C':4}] # 初始化合并字典,收集所有值 merged = {} for d in lst: for key, val in d.items(): merged.setdefault(key, []).append(val)
此时merged为:{'A': [1, 2, 3], 'B': [2, 2, 2], 'C': [4, 4, 4]}
步骤2:判断值是否一致并转换格式
遍历临时字典,对每个键的值列表做判断:若所有元素相同则替换为单个值,否则保留列表:
# 处理值格式 for key, values in merged.items(): if all(v == values[0] for v in values): merged[key] = values[0] print(merged)
运行后即可得到期望输出:{'A': [1, 2, 3], 'B': 2, 'C': 4}
简化写法(字典推导式)
可以将步骤2用字典推导式简化,一行完成格式转换:
merged = { k: v[0] if all(x == v[0] for x in v) else v for k, v in merged.items() }
问题原因说明
你之前得到的结果中B和C是单元素列表,是因为只完成了收集值的步骤,没有对值列表做一致性判断和格式转换,所以所有值都被保留为列表形式。
内容的提问来源于stack exchange,提问作者Jennifer Therese
相关产品推荐
相关产品推荐

