新闻详情

新闻详情

首页 / 资讯中心 / 详情

Python-100-Days 番外篇:Python 容器使用小技巧实战指南

发布时间:2026/10/1 20:49:23来源:尧图网络
Python-100-Days 番外篇:Python 容器使用小技巧实战指南
文档教程【免费下载链接】Python-100-DaysPython - 100天从新手到大师项目地址https://gitcode.com/GitHub_Trending/py/Python-100-Days点击查看免费下载本篇技术指南基于《Python-100-Days》开源教程的番外篇文档整理成文聚焦list、tuple、set、dict等容器类型的高阶用法从字典最值提取、元素频次统计到切片截断、zip扩展、深浅拷贝与矩阵转置帮助你写出更简洁、更高效的 Pythonic 代码。读完本文你将掌握 8 类可立即投入日常开发的高频容器操作技巧并能理解其背后的原理。1. 从字典中取出最大值及其键假设字典对象对应的变量名为my_dict围绕取最大值这一需求有三种常见的诉求与对应写法。只取出最大值本身直接对字典的values()视图取maxmax(my_dict.values())取出最大值对应的键将max函数的key参数指定为my_dict.get即让max在比较时以每个键对应的值为依据最终返回的却是键本身max(my_dict, keymy_dict.get)同时取出最大值的键和值先把items()视图中的二元组键, 值交给max再通过key指定比较对象。这里既可以用lambda也可以用operator模块的itemgettermax(my_dict.items(), keylambda x: x[1])import operator max(my_dict.items(), keyoperator.itemgetter(1))说明operator.itemgetter的本质是返回一个取值函数。文档中对它的行为有非常直观的等价实现当传入单个索引时返回的函数取obj[item]当传入多个索引时返回的函数取tuple(obj[item] for item in items)。因此在keyoperator.itemgetter(1)中它帮我们取到了二元组中的第 2 个元素即值。相比lambda x: x[1]itemgetter在构造上更省内存、调用时也略快是标准库推荐的取值写法。关于字典的更多基础操作可以参考13.常用数据结构之字典.md中键值对存取、视图对象等内容。2. 统计列表中各元素出现的次数假设列表对象对应的变量名为my_list统计元素频次有三种递进式的写法。写法一集合 列表生成式以set(my_list)去重后的元素为键逐个调用count统计{x: my_list.count(x) for x in set(my_list)}该写法最直观但每个不同元素都要遍历一次列表时间复杂度为 O(n²)仅适合元素种类很少的场景。写法二itertools.groupby 排序先sorted让相同元素相邻再按相邻分组统计from itertools import groupby {key: len(list(group)) for key, group in groupby(sorted(my_list))}说明groupby只会把相邻且相同的元素分到一组所以必须先排序把相同元素聚集到一起才能得到正确的统计结果。写法三collections.Counter这是标准库专门为计数设计的容器一行即可完成from collections import Counter dict(Counter(my_list))Counter本质上就是一个dict子类除了统计频次还内置了most_common(n)取频次最高的前 n 项、elements()按频次展开元素等实用方法。日常统计频次时推荐优先使用该方案前两种写法更多用于理解计数背后的思路。3. 正确截断删除列表元素假设列表对象对应的变量名为my_list很多初学者会通过重新切片赋值的方式来截断列表my_list my_list[:i] my_list my_list[j:]这种方式虽然能得到想要的结果但它是重新创建一个新的列表对象并让变量名指向它原列表若还有其他引用其内容并不会被改变而且产生了无谓的对象创建开销。更推荐的做法是用del在原列表上就地删除del my_list[i:] del my_list[:j]两种方式的差异在于是否修改原对象my_list my_list[:i]生成新列表并替换绑定原列表对象保持不变del my_list[i:]直接在原列表对象上删除尾部元素所有引用同一列表的地方都会同步生效。切片运算的完整语义start、end、stride三段的含义与省略规则可以对照08.常用数据结构之列表-1.md中的切片章节学习那里还演示了如何用切片来修改列表元素。4. 按最长列表执行 zip 操作Python 内置函数zip会产生一个生成器对象将两个或多个可迭代对象的元素按位置组装成元组list(zip(abc, [1, 2, 3, 4]))执行结果如下。可以看到最终生成的元组个数由长度最短的可迭代对象决定所以这里只有 3 个元素[(a, 1), (b, 2), (c, 3)]如果希望由长度最大的可迭代对象来决定迭代出的元素个数可以使用itertools模块的zip_longest函数缺失的位置会用fillvalue填充默认是Nonefrom itertools import zip_longest list(zip_longest(abc, [1, 2, 3, 4]))执行结果[(a, 1), (b, 2), (c, 3), (None, 4)]# 也可以自定义填充值 list(zip_longest(abc, [1, 2, 3, 4], fillvalue-)) # [(a, 1), (b, 2), (c, 3), (-, 4)]5. 快速拷贝一个列表浅拷贝与深拷贝如果希望快速拷贝一个列表对象最简单的方式是切片thy_list my_list[:]但要注意切片只实现了浅拷贝它创建了新的列表对象而新列表中的元素与之前的列表是共享的——如果元素本身是可变对象如嵌套列表、字典修改会同时反映在两个列表中。标准库copy模块提供了更明确的两种拷贝方式浅拷贝copy.copy等价于切片的效果但可读性更强import copy thy_list copy.copy(my_list)深拷贝copy.deepcopy递归拷贝所有嵌套的可变对象得到完全独立的副本import copy thy_list copy.deepcopy(my_list)判断是否需要深拷贝的简单标准列表中是否包含可变元素。若全是数字、字符串等不可变对象浅拷贝即可若包含嵌套列表、字典、自定义对象且需要完全独立的数据副本则必须使用deepcopy。6. 对两个或多个列表的对应元素做运算map函数通常被用来对单个可迭代对象的元素做映射处理但它同样可以接收多个可迭代对象并通过传入的函数对它们的对应位置元素进行批量处理my_list [11, 13, 15, 17] thy_list [2, 4, 6, 8, 10] list(map(lambda x, y: x y, my_list, thy_list))运行结果[13, 17, 21, 25]注意结果只有 4 个元素——和zip一致map在接收多个可迭代对象时同样以最短长度为准。同样的运算也可以用zip配合列表生成式完成两种写法各有优劣map写法更接近并行映射的语义惰性求值、内存占用小列表生成式写法更贴近 Python 的直觉风格且便于在推导式中嵌套条件过滤my_list [11, 13, 15, 17] thy_list [2, 4, 6, 8, 10] [x y for x, y in zip(my_list, thy_list)]7. 一键清除列表中的空值和零值假设列表对象对应的变量名为my_list如果其中混入了None、0、、空列表等假值可以用filter配合内置的bool函数一键剔除list(filter(bool, my_list))等价于下面的列表生成式写法——利用 Python 的真值测试规则if x会过滤掉所有假值[x for x in my_list if x]两种写法都会保留所有真值元素非零数字、非空字符串、非空容器等。需要提醒的是如果业务上0是合法数据而只想剔除None则不应使用上述写法而应显式写if x is not None。8. 从嵌套列表中抽取指定列并实现矩阵转置假设my_list是一个嵌套列表可以把它看作数学上的矩阵my_list [ [1, 1, 2, 2], [5, 6, 7, 8], [3, 3, 4, 4], ]借助zip(*my_list)可以解包 转置*my_list把三个内层列表作为独立参数传给zipzip再按位置把它们的第一列、第二列……分别打包成元组。配合星号解包赋值语法可以轻松抽取出任意一列col1, *_ zip(*my_list) list(col1) # [1, 5, 3]_, col2, *_ zip(*my_list) list(col2) # [1, 6, 3]同理矩阵的转置也可以直接由zip(*my_list)完成再用列表生成式把每个元组转回列表[list(x) for x in zip(*my_list)]运行结果[[1, 5, 3], [1, 6, 3], [2, 7, 4], [2, 8, 4]]可以看到原矩阵的第 1 行[1, 1, 2, 2]变成了转置结果的第 1 列[1, 1, 2, 2]。这套解包 zip 解包赋值的组合拳是处理二维数据矩阵、表格行转列时最 Pythonic 的套路。小结从技巧到 Pythonic 思维回顾上述 8 个技巧可以提炼出几条贯穿始终的方法论善用key参数max、min、sorted等函数都支持key指定比较依据再配合operator.itemgetter能优雅地解决按值取键等场景认识标准库的专用容器计数用Counter、补位拉链用zip_longest、按字段取值用itemgetter标准库帮你封装了大部分重复逻辑区分重新绑定与就地修改切片赋值创建新对象del就地删除浅拷贝共享元素、深拷贝完全独立理解对象语义才能避免隐蔽的 bug用解包与zip处理二维结构*解包 zip的组合可以完成转置、抽列、多列表并行运算代码既短又不易出错。这些技巧配合Day01-20中列表、元组、集合、字典四大基础数据结构的完整讲解以及番外篇/Python编程惯例.md、番外篇/PEP8风格指南.md中的编码规范能够帮助你在掌握语法的基础上更进一步写出地道、高效、易维护的 Python 代码。对 Python 语言设计哲学感兴趣的读者还可以阅读番外篇/Python之禅的最佳翻译.md中简单优于复杂可读性至上等原则——容器小技巧正是这些原则在实践中的具体体现。赞分享文档教程【免费下载链接】Python-100-DaysPython - 100天从新手到大师项目地址https://gitcode.com/GitHub_Trending/py/Python-100-Days点击查看免费下载相关推荐Python-100-Days 番外篇读懂 Python 之禅Zen of Python 逐条精译与工程实践解读Python 100 Days 番外篇读懂 Python 之禅Zen of Python 逐条精译与工程实践解读 导读 Python 之禅Zen of文档教程PyPTO bitwise_or 接口详解按位或运算的 TileShape 切分、标量广播与跨平台实现路径PyPTO bitwise_or 接口详解按位或运算的 TileShape 切分、标量广播与跨平台实现路径 本文以 PyPTO 官方 API 文档 pypto文档教程Python-100-Days 实战使用 xlrd、xlwt、xlutils 读写 Excel 文件.xls 篇Python 100 Days 实战使用 xlrd、xlwt、xlutils 读写 Excel 文件.xls 篇 导读 在日常办公自动化与商业项目中“导文档教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

智慧志愿服务管理系统(DeepSeek流式AI对话、ECharts运营分析、协同过滤推荐、志愿活动发布与报名审核、签到码现场签到、活动与签到双重积分激励、积分商城兑换、志愿服务社区互动) 2026/10/1 20:49:16

智慧志愿服务管理系统(DeepSeek流式AI对话、ECharts运营分析、协同过滤推荐、志愿活动发布与报名审核、签到码现场签到、活动与签到双重积分激励、积分商城兑换、志愿服务社区互动)

系统亮点:DeepSeek流式AI对话、ECharts运营分析、协同过滤推荐、志愿活动发布与报名审核、签到码现场签到、活动与签到双重积分激励、积分商城兑换、志愿服务社区互动;一、项目概述智慧志愿服务管理系统采用前后端分离架构,面向志愿者和管理员…

阅读更多 →
分享一下我的项目规则AGENTS.md 的想法与技巧:从 JavaDoc 到注释规范 2026/10/1 20:49:16

分享一下我的项目规则AGENTS.md 的想法与技巧:从 JavaDoc 到注释规范

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
2025程序员转型AI应用工程师:用TaoToken统一Key跑通LLM Agent配置骨架 2026/10/1 20:49:16

2025程序员转型AI应用工程师:用TaoToken统一Key跑通LLM Agent配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

最新相关资讯

禾川PLC-HCA1(三菱FX1S)编程 2026/10/1 21:54:53

禾川PLC-HCA1(三菱FX1S)编程

目录: 一、禾川与三菱对照表 二、HCA1-16x14YR连接电脑 1、命名规则 2、编程线的连接 3、GX Works2设置 三、定时器应用 1、继电器介绍截图 2、100mS时基定时器编程 3、10mS时基定时器编程 前置知识:三菱FX系列PLC-编程1 一、禾川与三菱对照表 …

阅读更多 →
Python单元测试:你掌握了吗? 2026/10/1 21:54:39

Python单元测试:你掌握了吗?

关于单元测试, 你都已经完全地掌握住了吗。嘿, 各位朋友, 今天我们来聊聊测试单元测试框架的这个工具。它本身是自带功能的, 特别方便地用于管理以及执行测试用例。接下来, 我会详细为大家介绍一些关于使用的技巧。这句话的意思是, 测试构成了基础。首先, 我们接下来要聊一谈断…

阅读更多 →
17个纯CSS加载动画与进度条特效:可复用样式库 2026/10/1 21:54:32

17个纯CSS加载动画与进度条特效:可复用样式库

去年做后台系统重构的时候,最耗时间的不是权限模型,也不是接口联调,而是一个直径 24 像素的 loading 圈。产品经理来回改了七版,从“再快一点”到“能不能有点呼吸感”,最后我实在忍不住,把手上搜集的 CSS …

阅读更多 →
Unity物理引擎优化:FixedUpdate、Rigidbody与碰撞检测 2026/10/1 21:54:26

Unity物理引擎优化:FixedUpdate、Rigidbody与碰撞检测

1. 每帧的物理账本:FixedUpdate节拍与PhysX的求解顺序Unity物理引擎在3D侧用的是PhysX,2D侧用的是Box2D,这一点很多人用了几年都没搞清楚。它的工作范围其实很窄:算出谁和谁撞上了、撞上之后各自的位移和旋转该怎么变、约束和关节…

阅读更多 →
揭秘SnapOtter AI引擎:Python Sidecar调度、模型捆绑与GPU推理全流程解析 2026/10/1 21:54:26

揭秘SnapOtter AI引擎:Python Sidecar调度、模型捆绑与GPU推理全流程解析

揭秘SnapOtter AI引擎:Python Sidecar调度、模型捆绑与GPU推理全流程解析 【免费下载链接】SnapOtter Open-source, self-hosted file-processing tool. Convert, compress, OCR, transcribe & run local AI across image, video, audio, PDF & documents, via UI, RES…

阅读更多 →
AI辅助独立游戏开发:18天从零到Steam上架,15天营收破2万 2026/10/1 21:54:26

AI辅助独立游戏开发:18天从零到Steam上架,15天营收破2万

1. 从零到两万营收,我为什么选AI辅助做独立游戏先交代背景。我不是全职游戏开发者,白天有正职工作,做游戏纯粹是业余时间的兴趣。之前用Godot和Unity都折腾过几个小项目,但都停留在“能跑起来”的阶段,从来没有真正上线…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉