网站首页 > 技术文章 正文
以下是“Python进阶 - Day 1:深入理解数据结构”的详细学习内容,包含带注释的代码示例,帮助你掌握列表、字典、集合、元组的高级用法,并完成指定练习任务。
学习内容
- 列表(List)高级用法
- 列表推导式(List Comprehension):快速生成列表。
- 深拷贝与浅拷贝:理解对象引用和复制的区别。
- 字典(Dict)高级用法
- 字典推导式(Dict Comprehension):高效构建字典。
- 默认字典(collections.defaultdict):处理缺失键。
- 集合(Set)高级用法
- 集合推导式(Set Comprehension):去重与集合操作。
- 集合运算:交集、并集、差集。
- 元组(Tuple)高级用法
- 不可变性与内存效率。
- 命名元组(collections.namedtuple):增强可读性。
- 深拷贝与浅拷贝
- 浅拷贝(copy.copy):复制对象但不复制嵌套对象。
- 深拷贝(copy.deepcopy):完全复制,包括嵌套对象。
任务
- 练习:实现一个函数 compare_lists,比较两个列表的差异,返回新增、删除和相同的元素。
代码示例(带注释)
1. 列表、字典、集合、元组的高级用法
python
# 导入所需模块
import copy
from collections import defaultdict, namedtuple
# 列表推导式:生成平方数列表
squares = [x**2 for x in range(5)]
print("列表推导式:", squares) # 输出: [0, 1, 4, 9, 16]
# 字典推导式:创建键值对
dict_squares = {x: x**2 for x in range(5)}
print("字典推导式:", dict_squares) # 输出: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
# 默认字典:自动为缺失键提供默认值
dd = defaultdict(int) # 默认值为0
dd['a'] += 1
print("默认字典:", dd) # 输出: defaultdict(<class 'int'>, {'a': 1})
# 集合推导式:生成偶数集合
evens = {x for x in range(10) if x % 2 == 0}
print("集合推导式:", evens) # 输出: {0, 2, 4, 6, 8}
# 集合运算
set_a = {1, 2, 3}
set_b = {2, 3, 4}
print("交集:", set_a & set_b) # 输出: {2, 3}
print("并集:", set_a | set_b) # 输出: {1, 2, 3, 4}
print("差集:", set_a - set_b) # 输出: {1}
# 命名元组:增强元组的可读性
Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)
print("命名元组:", p.x, p.y) # 输出: 1 2
# 深拷贝与浅拷贝
original = [[1, 2], [3, 4]]
shallow_copy = copy.copy(original) # 浅拷贝,只复制外层
deep_copy = copy.deepcopy(original) # 深拷贝,复制所有层
original[0][0] = 99
print("原始列表:", original) # 输出: [[99, 2], [3, 4]]
print("浅拷贝:", shallow_copy) # 输出: [[99, 2], [3, 4]]
print("深拷贝:", deep_copy) # 输出: [[1, 2], [3, 4]]
2. 练习:比较两个列表的差异
python
def compare_lists(list1, list2):
"""
比较两个列表的差异,返回新增、删除和相同的元素。
参数:
list1 (list): 第一个列表
list2 (list): 第二个列表
返回:
dict: 包含 'added'(新增)、'removed'(删除)、'common'(相同)的结果
"""
# 转换为集合以便高效比较
set1 = set(list1)
set2 = set(list2)
# 计算差异
added = list(set2 - set1) # list2 中有而 list1 中没有的元素
removed = list(set1 - set2) # list1 中有而 list2 中没有的元素
common = list(set1 & set2) # list1 和 list2 共有的元素
# 返回结果字典
return {
'added': added,
'removed': removed,
'common': common
}
# 测试函数
list1 = [1, 2, 3, 4]
list2 = [2, 3, 5, 6]
result = compare_lists(list1, list2)
print("比较结果:", result)
# 输出: {'added': [5, 6], 'removed': [1, 4], 'common': [2, 3]}
输出示例
运行上述代码后,输出如下:
列表推导式: [0, 1, 4, 9, 16]
字典推导式: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
默认字典: defaultdict(<class 'int'>, {'a': 1})
集合推导式: {0, 2, 4, 6, 8}
交集: {2, 3}
并集: {1, 2, 3, 4}
差集: {1}
命名元组: 1 2
原始列表: [[99, 2], [3, 4]]
浅拷贝: [[99, 2], [3, 4]]
深拷贝: [[1, 2], [3, 4]]
比较结果: {'added': [5, 6], 'removed': [1, 4], 'common': [2, 3]}
学习要点
- 推导式:列表、字典、集合推导式是Python高效生成数据结构的工具,减少代码量。
- 集合运算:利用集合的数学特性(如&、|、-)快速处理数据差异。
- 深浅拷贝:浅拷贝只复制引用,深拷贝创建独立副本,嵌套对象处理需谨慎。
- 命名元组:为元组字段命名,提升代码可读性,适合轻量数据结构。
后续建议
- 尝试修改compare_lists函数,支持重复元素的计数(提示:使用collections.Counter)。
- 实验深拷贝与浅拷贝在复杂嵌套对象(如字典中套列表)中的表现。
完成Day 1后,你已掌握Python数据结构的高级用法,并通过练习巩固了知识。如果需要进一步解释或扩展代码,随时告诉我!明天可以进入函数进阶或面向对象编程,加油!
- 上一篇: Java中transient字段的作用
- 下一篇: SpringBoot中几种文件上传下载工具
猜你喜欢
- 2025-05-27 Java中transient字段的作用
- 2025-05-27 深度学习数据集处理常用函数示例(Python)
- 2025-05-27 Go语言-指针
- 2025-05-27 什么是 happens-before 规则?
- 2025-05-27 「Java」一张图教会你关于null的几种处理方式(内附代码)
- 2025-05-27 Python 中常用的数据结构,帮助你从基础到精通
- 2025-05-27 1、数值类型
- 2025-05-27 基础函数20例,案例解读,再不掌握就真的Out了
- 2025-05-27 12 个 C# 提效实用干货
- 2025-05-27 Java中数组的声明和初始化方法
- 08-06中等生如何学好初二数学函数篇
- 08-06C#构造函数
- 08-06初中数学:一次函数学习要点和方法
- 08-06仓颉编程语言基础-数据类型—结构类型
- 08-06C++实现委托机制
- 08-06初中VS高中三角函数:从"固定镜头"到"360°全景",数学视野升级
- 08-06一文讲透PLC中Static和Temp变量的区别
- 08-06类三剑客:一招修改所有对象!类方法与静态方法的核心区别!
- 1524℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 662℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 528℃MySQL service启动脚本浅析(r12笔记第59天)
- 494℃启用MySQL查询缓存(mysql8.0查询缓存)
- 493℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 481℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 463℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 461℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (70)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)