0

0

Python中如何根据关联列表进行数据重组与排序

霞舞

霞舞

发布时间:2025-10-21 13:02:17

|

1025人浏览过

|

来源于php中文网

原创

Python中如何根据关联列表进行数据重组与排序

本教程将详细介绍在python中如何根据一个列表的值来重排、分组并排序另一个关联列表的数据。通过结合使用zip函数与字典(如dict.setdefault或defaultdict),可以高效地处理一对一映射的数据,实现灵活的数据重组和有序输出,适用于需要根据共同键值进行数据聚合的场景。

在数据处理场景中,我们经常会遇到需要同时操作两个或多个具有一对一对应关系的列表。例如,一个列表包含分类标识符,另一个列表包含与这些标识符相关联的实际数据。我们的目标是根据第一个列表的标识符对第二个列表的数据进行分组和排序。

考虑以下两个列表: second_lines_different_folders = [404, 403, 405, 404, 405]different_lines_folders = [4, 5, 6, 7, 9]

这里,second_lines_different_folders可以看作是分组的键(例如HTTP状态码),而different_lines_folders则是与这些键相关联的值(例如对应的文件夹ID)。我们希望的输出是: Rearranged list: [[403], [404, 404], [405, 405]] (按状态码分组的状态码自身) Rearranged folders: [[5], [4, 7], [6, 9]] (按状态码分组的文件夹ID)

核心思路:配对、分组与排序

实现这一目标的关键步骤包括:

  1. 配对 (Zipping): 将两个关联列表的元素一一配对。
  2. 分组 (Grouping): 使用字典结构,以第一个列表的元素作为键,将第二个列表的对应元素收集到列表中。
  3. 排序 (Sorting): 根据键的自然顺序对分组后的结果进行排序。

1. 使用 zip 函数进行列表配对

Python的内置函数zip()能够将多个可迭代对象打包成一个元组的迭代器,其中每个元组包含来自每个可迭代对象的对应元素。这是处理关联列表的起点,它有效地创建了键值对的流。

second_lines_different_folders = [404, 403, 405, 404, 405]
different_lines_folders = [4, 5, 6, 7, 9]

# 使用 zip 将两个列表的元素一一配对
# 例如:(404, 4), (403, 5), (405, 6), ...
paired_data = zip(second_lines_different_folders, different_lines_folders)

# 打印配对结果(可选,用于理解)
# for a, b in paired_data:
#     print(f"Key: {a}, Value: {b}")

2. 使用字典进行数据分组

在配对完成后,我们需要将数据按键进行分组。Python字典是实现这一功能的理想选择。这里介绍两种常用的方法:dict.setdefault() 和 collections.defaultdict。

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

方法一:利用 dict.setdefault()

dict.setdefault(key, default_value) 方法用于获取字典中指定键的值。如果键不存在,则插入键,并将其值设置为default_value,然后返回default_value。这对于在字典中初始化一个空列表并向其添加元素非常有用,避免了显式检查键是否存在的步骤。

second_lines_different_folders = [404, 403, 405, 404, 405]
different_lines_folders = [4, 5, 6, 7, 9]

# 初始化两个字典用于存储分组结果
grouped_keys = {}  # 存储原始键的分组
grouped_values = {} # 存储关联值的分组

# 遍历配对后的数据
for key, value in zip(second_lines_different_folders, different_lines_folders):
    # 将键自身添加到 grouped_keys 中
    grouped_keys.setdefault(key, []).append(key)
    # 将关联值添加到 grouped_values 中
    grouped_values.setdefault(key, []).append(value)

print(f"Grouped keys (unsorted): {grouped_keys}")
print(f"Grouped values (unsorted): {grouped_values}")

输出示例:

论论App
论论App

AI文献搜索、学术讨论平台,涵盖了各类学术期刊、学位、会议论文,助力科研。

下载
Grouped keys (unsorted): {404: [404, 404], 403: [403], 405: [405, 405]}
Grouped values (unsorted): {404: [4, 7], 403: [5], 405: [6, 9]}

请注意,字典的输出顺序在Python 3.7+中会保留插入顺序,但为了确保按键的自然顺序输出,我们通常还需要进行显式排序。

方法二:利用 collections.defaultdict

collections.defaultdict 是 dict 的一个子类,它重写了 __missing__ 方法。当访问一个不存在的键时,它会自动调用工厂函数(例如 list)来为该键生成一个默认值。这使得代码更加简洁,无需在每次添加元素时都调用setdefault。

from collections import defaultdict

second_lines_different_folders = [404, 403, 405, 404, 405]
different_lines_folders = [4, 5, 6, 7, 9]

# 初始化两个 defaultdict,工厂函数为 list
grouped_keys_dd = defaultdict(list)
grouped_values_dd = defaultdict(list)

# 遍历配对后的数据
for key, value in zip(second_lines_different_folders, different_lines_folders):
    grouped_keys_dd[key].append(key)
    grouped_values_dd[key].append(value)

print(f"Grouped keys (unsorted, defaultdict): {grouped_keys_dd}")
print(f"Grouped values (unsorted, defaultdict): {grouped_values_dd}")

输出示例与使用 setdefault 类似。defaultdict 的优势在于其简洁性,尤其在循环中频繁向字典添加元素时,代码更易读。

3. 对分组结果进行排序

为了确保输出始终按键的自然顺序排列,我们需要显式地对字典的键进行排序,然后根据排序后的键来提取对应的值列表。

# 假设我们已经通过上述任一方法得到了 grouped_keys 和 grouped_values 字典
# 这里以上面使用 setdefault 的结果为例:
grouped_keys = {404: [404, 404], 403: [403], 405: [405, 405]}
grouped_values = {404: [4, 7], 403: [5], 405: [6, 9]}

# 获取并排序所有键
sorted_keys = sorted(grouped_keys.keys()) # 也可以是 sorted(grouped_values.keys())

# 根据排序后的键构建最终的有序列表
final_rearranged_keys = [grouped_keys[k] for k in sorted_keys]
final_rearranged_values = [grouped_values[k] for k in sorted_keys]

print(f"Rearranged list: {final_rearranged_keys}")
print(f"Rearranged folders: {final_rearranged_values}")

预期输出:

Rearranged list: [[403], [404, 404], [405, 405]]
Rearranged folders: [[5], [4, 7], [6, 9]]

完整示例代码

为了更清晰地展示整个流程,以下是使用 defaultdict 实现的完整代码,它集成了配对、分组和排序的所有步骤:

from collections import defaultdict

# 原始数据
second_lines_different_folders = [404, 403, 405, 404, 405]
different_lines_folders = [4, 5, 6, 7, 9]

# 初始化 defaultdict 用于存储分组结果
out_keys = defaultdict(list)
out_values = defaultdict(list)

# 1. 配对并分组数据
# 遍历 zip 生成的键值对
for key, value in zip(second_lines_different_folders, different_lines_folders):
    out_keys[key].append(key)   # 将键自身添加到 out_keys 中
    out_values[key].append(value) # 将关联值添加到 out_values 中

# 2. 对分组结果进行排序
# 获取并排序所有唯一的键
sorted_order = sorted(out_keys.keys())

# 根据排序后的键,使用列表推导式重构最终的有序列表
final_rearranged_keys = [out_keys[k] for k in sorted_order]
final_rearranged_values = [out_values[k] for k in sorted_order]

# 打印最终结果
print(f"Rearranged list: {final_rearranged_keys}")
print(f"Rearranged folders: {final_rearranged_values}")

注意事项与总结

  • 选择 dict.setdefault 还是 defaultdict: 两者都能实现相同的功能。defaultdict 通常在代码简洁性方面略胜一筹,因为它省去了显式检查键是否存在和初始化列表的步骤。dict.setdefault 则更通用,适用于不需要预设默认值类型的情况,或者当你在一个循环中需要对一个键进行多种不同的操作时。
  • 数据一致性: 确保两个列表的长度一致,且元素之间确实存在一对一的逻辑对应关系,是此方法有效的前提。如果列表长度不一致,zip 函数会以最短的列表为准截断。
  • 键的唯一性与可哈希性: 字典的键必须是唯一的且可哈希的(

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

183

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

289

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

259

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

126

2025.08.07

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

434

2023.11.09

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

420

2023.11.14

HTTP 503错误解决方法
HTTP 503错误解决方法

HTTP 503错误表示服务器暂时无法处理请求。想了解更多http错误代码的相关内容,可以阅读本专题下面的文章。

2403

2024.03.12

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2140

2024.08.16

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

33

2026.01.31

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新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号