Python 合并字典(手把手讲解)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

在 Python 开发中,字典(Dictionary)是一种灵活且强大的数据结构,广泛应用于数据存储、配置管理、键值映射等场景。随着项目复杂度的提升,开发者常需要将多个字典合并为一个,以整合配置信息、汇总数据或简化代码逻辑。本文将从基础概念出发,结合代码示例和实际案例,深入讲解 Python 合并字典的多种方法,并分析不同场景下的选择策略。无论是编程新手还是有一定经验的开发者,都能从中找到适合自己的解决方案。


二、字典基础概念:理解键值对结构

在合并字典之前,我们需要明确字典的基本特性。Python 字典由键(Key)和值(Value)组成,键必须是不可变类型(如字符串、元组),且唯一;值可以是任意数据类型,且允许重复。例如:

dict1 = {"apple": 1, "banana": 2}  
dict2 = {"orange": 3, "grape": 4}  

字典的合并本质是将两个或多个字典的键值对整合到一个新字典中。若存在重复键,则需确定保留哪个值。例如,若 dict1dict2 都有键 "pear",合并时需要明确规则。


三、传统方法合并字典:基础操作与局限性

3.1 使用 update() 方法

update() 是字典对象的内置方法,可以直接将另一个字典的键值对合并到当前字典中。但需注意:

  • 修改原字典update() 会直接修改调用它的字典,而非创建新对象。
  • 重复键处理:后出现的字典的键值会覆盖前者的同名键。

示例代码:

original = {"a": 1, "b": 2}  
new_data = {"b": 3, "c": 4}  
original.update(new_data)  
print(original)  # 输出:{'a': 1, 'b': 3, 'c': 4}  

比喻:这就像整理书架时,把新书按类别直接放入已有书架,若已有同名书籍,则新书会替换旧书。

3.2 字典推导式与循环遍历

若希望合并后保留所有键值,且不修改原字典,可以使用字典推导式或循环:

dict3 = {**dict1, **dict2}  # Python 3.5+ 支持  
merged = {}  
for d in [dict1, dict2]:  
    merged.update(d)  
print(merged)  # 输出:{'apple': 1, 'banana': 2, 'orange': 3, 'grape': 4}  

此方法生成新字典,但重复键仍以最后一个字典的值为准。


四、Python 3.9+ 新特性:| 操作符与 merge()

4.1 合并操作符 |

Python 3.9 引入了 | 操作符,简化了字典合并语法:

dict1 = {"x": 10, "y": 20}  
dict2 = {"y": 30, "z": 40}  
merged_dict = dict1 | dict2  # 输出:{'x': 10, 'y': 30, 'z': 40}  

关键特性

  • 不修改原字典,返回新字典;
  • 右侧字典的键值优先级更高。

4.2 merge() 方法(仅 Python 3.10+)

更高版本的 Python 还支持 dict.merge() 方法,但需注意其与 update() 的区别:

result = {}  
result.merge(dict1)  
result.merge(dict2)  # 同样以 dict2 的键值覆盖  

此方法更灵活,但需在新建字典后逐步合并。


五、高级技巧:处理复杂场景与冲突

5.1 自定义冲突解决逻辑

若希望合并时对重复键执行特定操作(如求和),可用字典推导式结合条件判断:

def merge_sum(d1, d2):  
    return {k: d1.get(k, 0) + d2.get(k, 0) for k in set(d1) | set(d2)}  

sales_jan = {"apple": 100, "banana": 200}  
sales_feb = {"apple": 150, "orange": 250}  
total = merge_sum(sales_jan, sales_feb)  # 输出:{'apple': 250, 'banana': 200, 'orange': 250}  

比喻:这如同将两个购物车合并时,对同一商品的数量进行累加。

5.2 处理嵌套字典与多重字典

对于嵌套结构或多个字典的合并,可递归遍历或使用第三方库(如 deepmerge)。例如:

def deep_merge(dict1, dict2):  
    merged = dict1.copy()  
    for key, value in dict2.items():  
        if key in merged and isinstance(merged[key], dict) and isinstance(value, dict):  
            merged[key] = deep_merge(merged[key], value)  
        else:  
            merged[key] = value  
    return merged  

d1 = {"a": {"x": 1}, "b": 2}  
d2 = {"a": {"y": 3}, "c": 4}  
print(deep_merge(d1, d2))  # 输出:{'a': {'x': 1, 'y': 3}, 'b': 2, 'c': 4}  

六、实际案例解析:从理论到应用

6.1 案例 1:电商商品库存合并

假设某电商平台需要整合多个仓库的库存数据:

warehouse1 = {"shoes": 50, "hats": 30}  
warehouse2 = {"shoes": 20, "bags": 40}  
total_stock = warehouse1 | warehouse2  # 合并后:"shoes" 的值为 20(以 warehouse2 为准)  

关键点:通过 | 操作符快速合并,同时明确库存数据以最新仓库为准。

6.2 案例 2:用户配置合并

用户默认配置与自定义配置需合并:

default_config = {"theme": "light", "notifications": True}  
user_config = {"theme": "dark", "font_size": 14}  
final_config = default_config | user_config  # 用户配置覆盖默认值  

此操作确保用户个性化设置优先级最高。


七、注意事项与性能优化

7.1 键的唯一性与不可变性

  • 键必须是不可变类型(如字符串、元组),否则会引发 TypeError
  • 合并时若键重复,需明确冲突解决逻辑,避免数据覆盖导致的意外结果。

7.2 性能比较

方法时间复杂度是否修改原字典
update()O(n)
字典解包 **O(n)
| 操作符O(n)
自定义函数O(n)

建议:对于大型字典(如百万级数据),应优先选择原生方法以减少内存消耗。


八、结论

Python 合并字典的方法多样,开发者需根据场景需求选择最优方案:

  • 简单合并:优先使用 | 操作符或字典解包;
  • 保留原数据:避免直接调用 update(),改用生成新字典;
  • 复杂逻辑:通过自定义函数或递归实现嵌套合并。

掌握这些技巧不仅能提升代码效率,还能增强数据处理的灵活性。随着 Python 版本的迭代,开发者应关注新特性(如 | 操作符),以简化日常开发流程。希望本文能帮助你更自信地应对字典合并的挑战!

最新发布