Python中基于特定键entity合并字典列表重复项的实现方法
按特定键合并字典列表的Python实现
嘿,这个需求我之前在项目里也遇到过,用Python处理起来其实挺直观的,我给你分享几种实用的实现方式,你可以根据自己的场景来选~
先假设你的原始字典列表是这样的(如果和实际不符,替换成你的数据就行):
original_list = [ {"entity": "apple", "price": 5, "color": "red"}, {"entity": "apple", "stock": 100}, {"entity": "banana", "price": 3}, {"entity": "banana", "color": "yellow", "stock": 150} ]
方法一:普通字典遍历实现
这是最基础的方式,逻辑清晰,适合新手理解:
original_list = [ {"entity": "apple", "price": 5, "color": "red"}, {"entity": "apple", "stock": 100}, {"entity": "banana", "price": 3}, {"entity": "banana", "color": "yellow", "stock": 150} ] # 初始化一个空字典,用来存储合并后的结果,key是entity的值,value是合并后的字典 merged_dict = {} for item in original_list: # 获取当前字典的entity值作为键 entity_key = item["entity"] if entity_key in merged_dict: # 如果这个entity已经存在,就把当前字典的键值对更新进去 # 注意:如果有重复的键,后面的值会覆盖前面的 merged_dict[entity_key].update(item) else: # 如果不存在,就把当前字典的副本存入(用copy避免后续修改原列表的对象) merged_dict[entity_key] = item.copy() # 把字典的值转成列表,就是最终的合并结果 merged_list = list(merged_dict.values()) print(merged_list)
运行后会得到:
[ {"entity": "apple", "price": 5, "color": "red", "stock": 100}, {"entity": "banana", "price": 3, "color": "yellow", "stock": 150} ]
方法二:使用collections.defaultdict简化代码
如果你觉得上面的判断有点繁琐,可以用collections模块里的defaultdict,它会自动为不存在的键创建默认值,代码更简洁:
from collections import defaultdict original_list = [ {"entity": "apple", "price": 5, "color": "red"}, {"entity": "apple", "stock": 100}, {"entity": "banana", "price": 3}, {"entity": "banana", "color": "yellow", "stock": 150} ] # 初始化defaultdict,默认值是空字典 merged_dict = defaultdict(dict) for item in original_list: entity_key = item["entity"] # 直接update就行,不存在的键会自动创建空字典 merged_dict[entity_key].update(item) merged_list = list(merged_dict.values()) print(merged_list)
这个方法和上面的效果完全一样,只是代码更简洁,适合有一定基础的开发者。
特殊情况:处理重复键的多值合并
如果同一个entity下的字典有重复的键(比如两个apple字典都有price键但值不同),上面的方法会用后面的值覆盖前面的。如果你需要保留所有值(比如转成列表),可以这样修改:
from collections import defaultdict original_list = [ {"entity": "apple", "price": 5, "color": "red"}, {"entity": "apple", "price": 6, "stock": 100}, {"entity": "banana", "price": 3}, {"entity": "banana", "color": "yellow", "stock": 150} ] # 嵌套的defaultdict,内层默认是列表 merged_dict = defaultdict(lambda: defaultdict(list)) for item in original_list: entity_key = item["entity"] for k, v in item.items(): # 把每个键的值都添加到对应的列表里 merged_dict[entity_key][k].append(v) # 把嵌套的字典转成普通字典,可选:如果列表里的值都相同就取单个值,否则保留列表 final_list = [] for entity, data in merged_dict.items(): final_item = {} for k, v in data.items(): # 判断列表里的元素是否唯一 unique_values = set(v) if len(unique_values) == 1: final_item[k] = v[0] else: final_item[k] = v final_list.append(final_item) print(final_list)
运行后会得到:
[ {"entity": ["apple", "apple"], "price": [5, 6], "color": ["red"], "stock": [100]}, {"entity": ["banana", "banana"], "price": [3], "color": ["yellow"], "stock": [150]} ]
当然,你也可以根据自己的需求调整这里的处理逻辑,比如去重、取平均值等等。
内容的提问来源于stack exchange,提问作者Javed
相关产品推荐
相关产品推荐

