You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:34:07