0

0

Python中高效合并多个字典相同键的列表值

花韻仙語

花韻仙語

发布时间:2025-12-13 21:46:19

|

220人浏览过

|

来源于php中文网

原创

Python中高效合并多个字典相同键的列表值

本文旨在介绍如何高效且pythonic地合并多个字典,特别是当这些字典拥有相同的键,且键对应的值是需要合并的列表时。我们将详细探讨使用`collections.defaultdict`结合`list.extend()`方法,提供一种简洁、强大的解决方案,以避免常见的合并误区,并确保正确地聚合所有相关列表数据。

解决字典列表值合并问题

在Python编程中,我们经常会遇到需要合并多个字典的场景。一个常见的需求是,当多个字典拥有相同的键,但这些键对应的值是列表,并且我们希望将这些列表值进行合并(即连接)而非简单覆盖时。

例如,考虑以下两个字典:

dict_1 = {"a": ["1"], "b": ["3"]}
dict_2 = {"a": ["2"], "b": ["3"]}

我们期望的合并结果是:

new_dict = {'a': ["1", "2"], 'b': ["3", "3"]}

然而,如果仅仅使用Python 3.5+的字典合并语法,如 merged_dict = {**dict_1, **dict_2},结果将是 {'a': ['2'], 'b': ['3']}。这是因为后面的字典会覆盖前面字典中相同的键,而不是合并其值。对于列表值合并的需求,我们需要一种更精细的方法。

立即学习Python免费学习笔记(深入)”;

使用 collections.defaultdict 进行高效合并

Python标准库中的 collections 模块提供了一个名为 defaultdict 的工厂函数,它非常适合解决这类问题。defaultdict 的一个主要特点是,当访问一个不存在的键时,它会自动调用工厂函数来生成一个默认值。

AI Room Planner
AI Room Planner

AI 室内设计工具,免费为您的房间提供上百种设计方案

下载

对于我们的场景,我们可以将 list 作为 defaultdict 的工厂函数。这意味着,每当我们尝试访问一个新键时,defaultdict 会自动为该键创建一个空列表。然后,我们可以利用列表的 extend() 方法将来自不同字典的列表值追加到这个默认创建的列表中。

以下是实现此功能的Pythonic方法:

from collections import defaultdict

# 示例输入字典
dict_1 = {"a": ["1"], "b": ["3"]}
dict_2 = {"a": ["2"], "b": ["3"]}
dict_3 = {"a": ["4", "5"], "c": ["6"]} # 增加一个字典以展示多字典合并

# 初始化一个defaultdict,默认值为list
merged_dict = defaultdict(list)

# 遍历所有需要合并的字典
for d in [dict_1, dict_2, dict_3]:
    # 遍历当前字典中的所有键值对
    for key, value in d.items():
        # 使用extend方法将当前字典的列表值添加到merged_dict中对应键的列表中
        merged_dict[key].extend(value)

# 将defaultdict转换为普通字典(可选,如果后续操作不需要defaultdict特性)
final_dict = dict(merged_dict)

print(final_dict)

输出结果:

{'a': ['1', '2', '4', '5'], 'b': ['3', '3'], 'c': ['6']}

代码解析

  1. from collections import defaultdict: 导入 defaultdict 类。
  2. merged_dict = defaultdict(list): 创建一个 defaultdict 实例。当尝试访问 merged_dict 中不存在的键时,它会自动为该键创建一个空列表作为其值。
  3. for d in [dict_1, dict_2, dict_3]:: 这是一个外部循环,用于迭代所有需要合并的输入字典。
  4. for key, value in d.items():: 这是一个内部循环,用于遍历当前字典 d 中的每一个键值对
  5. merged_dict[key].extend(value): 这是核心操作。
    • merged_dict[key]:如果 key 第一次被访问,defaultdict 会自动为它创建一个空列表。如果 key 已经存在,则直接获取其关联的列表。
    • .extend(value):extend() 方法用于将一个可迭代对象(在这里是 value,它本身是一个列表)中的所有元素添加到当前列表的末尾。这与 append() 不同,append() 会将整个 value 列表作为一个单一元素添加到当前列表。extend() 正是我们所需的列表合并操作。

为什么 defaultdict 是一个Pythonic且高效的选择?

  • 简洁性与可读性:相较于手动检查键是否存在并初始化列表的传统方法,defaultdict 极大地简化了代码逻辑,使其更易于理解。
  • 效率:defaultdict 在内部优化了键查找和值初始化过程。它避免了多次 if key in dict: 的显式检查,从而提高了效率。
  • 通用性:这种方法不仅适用于合并两个字典,也适用于合并任意数量的字典,只需将它们放入一个可迭代对象中即可。
  • 处理新键:如果某个键只存在于部分字典中,defaultdict 会自动为它创建并初始化列表,然后添加其值,无需额外的逻辑处理。

注意事项

  • 数据类型一致性:此方法假设所有待合并的字典中,相同键对应的值都是列表。如果存在非列表类型的值,extend() 方法可能会引发 TypeError 或产生非预期的行为。
  • 性能考量:对于拥有极大量键值对或需要合并的字典数量非常庞大的场景,虽然 defaultdict 效率较高,但仍然需要遍历所有键值对。在极端性能敏感的场景下,可能需要进一步考虑数据结构或并行处理方案,但这超出了本教程的范围。
  • 结果类型:defaultdict 的结果本身是一个 defaultdict 实例。如果最终需要一个普通的 dict,可以使用 dict(merged_dict) 进行转换,如示例所示。

总结

当需要合并多个字典中相同键的列表值时,collections.defaultdict 结合 list.extend() 提供了一种优雅、高效且符合Pythonic风格的解决方案。它避免了手动管理键是否存在和列表初始化的复杂性,使代码更加简洁、健壮,并能轻松处理任意数量的输入字典。掌握这种模式对于处理复杂数据聚合任务的Python开发者来说至关重要。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

310

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

222

2025.10.31

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

780

2023.08.22

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

539

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

21

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

28

2026.01.06

append用法
append用法

append是一个常用的命令行工具,用于将一个文件的内容追加到另一个文件的末尾。想了解更多append用法相关内容,可以阅读本专题下面的文章。

344

2023.10.25

python中append的用法
python中append的用法

在Python中,append()是列表对象的一个方法,用于向列表末尾添加一个元素。想了解更多append的更多内容,可以阅读本专题下面的文章。

1074

2023.11.14

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.7万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号