Python 四大核心内置容器类型:列表、元组、字典、集合,是日常开发**使用率100%**的数据结构。绝大多数业务数据存储、数据去重、数据筛选、参数组装、结果聚合全部依赖容器类型。
本文全覆盖指定知识点:四大容器特性、通用切片语法、列表推导式、生成器表达式。全程搭配可运行代码、底层原理拆解、高频踩坑点、面试真题,是Python进阶、刷题、项目开发的核心基础笔记。
一、四大内置容器总览
Python 内置四大高频容器,根据是否可变、是否有序、是否可重复、是否键值对区分使用场景:
1、列表 list:有序、可变、可重复,最通用容器;
2、元组 tuple:有序、不可变、可重复,只读安全数据;
3、字典 dict:3.7+有序、可变、键唯一,键值对存储;
4、集合 set:无序、可变、元素唯一,主打去重、交集差集。
二、列表 List(最常用可变容器)
列表是有序可变序列,支持增删改查、嵌套、动态扩容,适合存储频繁修改的一组数据。
2.1 基础定义与常用操作
# 列表定义
lst = [1, 2, 3, "python", True]
# 增
lst.append(666) # 尾部追加
lst.insert(0, 999) # 指定位置插入
lst.extend([10,20]) # 迭代扩展
# 删
lst.pop() # 默认删除尾部,返回删除值
lst.pop(0) # 删除指定索引
lst.remove("python") # 根据元素删除首个匹配项
# lst.clear() # 清空列表
# 改
lst[0] = 888
# 查
print(lst[0]) # 索引取值
print(len(lst)) # 列表长度
print(888 in lst) # 成员判断
2.2 核心特性与工程坑点
特性:有序存储、元素类型任意、支持重复、动态扩容、可变对象。
高频坑点:
1、列表属于可变类型,赋值操作是浅拷贝引用传递,修改新列表会影响原列表;
2、循环遍历列表时直接删除元素,会导致索引错乱、漏删元素;
3、频繁中间插入/删除效率低,底层动态数组,中间操作需迁移内存。
三、元组 Tuple(只读不可变容器)
元组是有序不可变序列,定义后无法增删改,数据安全、内存占用小、可作为字典的键。
3.1 基础定义与特性
# 元组定义
t1 = (1, 2, 3, "python")
t2 = (999,) # 单个元素必须加逗号,否则识别为普通括号
# 只读操作:仅查询,无法修改
print(t1[0])
print(len(t1))
print(2 in t1)
# 元组拼接(生成新元组)
t3 = t1 + t2
print(t3)
3.2 特殊坑点:元组嵌套可变对象
# 元组本身不可变,但内部嵌套列表可修改
t = (1, 2, [3, 4])
# t[0] = 999 # 报错!元组元素不可替换
t[2].append(5) # 合法!内部列表可变
print(t) # (1, 2, [3, 4, 5])
原理:元组不可变指的是元素引用地址不可变,不限制引用对象内部修改。
3.3 使用场景
1、固定配置数据、防止程序意外修改;
2、作为字典key、集合元素(不可变类型可哈希);
3、函数多返回值默认元组返回,节省内存。
四、字典 Dict(键值对存储)
字典是 Python 哈希表结构,3.7版本后默认有序,key唯一、查询速度极快,适合映射关系存储。
4.1 基础增删改查
# 字典定义
dic = {"name": "python", "age": 20, "level": "high"}
# 查
print(dic["name"]) # 直接取值,无key报错
print(dic.get("sex", "未知")) # get取值,无key不报错,支持默认值
# 增/改
dic["sex"] = "男" # 无则新增,有则覆盖
# 删
dic.pop("level") # 删除指定key
# dic.clear() # 清空字典
# 遍历
print(dic.keys()) # 所有键
print(dic.values()) # 所有值
print(dic.items()) # 所有键值对
4.2 核心约束与坑点
1、字典 key 必须是不可变类型(数字、字符串、元组),列表/集合不能做key;
2、key 唯一,重复赋值会覆盖旧值;
3、哈希表查询时间复杂度 O(1),远快于列表遍历查询;
4、遍历字典时新增/删除键值对会触发异常。
五、集合 Set(去重与集合运算)
集合是无序、元素唯一、可变容器,底层同样是哈希表,核心能力:自动去重、交集、并集、差集运算。
5.1 基础用法与去重
# 集合定义
s = {1, 2, 2, 3, 3, 4}
print(s) # 自动去重 {1,2,3,4}
# 空集合必须用 set(),{}是空字典
empty_set = set()
# 增删
s.add(5)
s.remove(1)
s.discard(999) # 不存在不报错
# 集合运算
s1 = {1, 2, 3}
s2 = {3, 4, 5}
print(s1 & s2) # 交集 {3}
print(s1 | s2) # 并集 {1,2,3,4,5}
print(s1 - s2) # 差集 {1,2}
5.2 核心坑点
1、集合元素必须是可哈希不可变类型,列表、字典无法存入集合;
2、无序结构,不支持索引取值、切片;
3、主要用于数据去重、关系比对,不适合存储有序业务数据。
六、切片语法(序列通用技能)
切片是 Python 列表、元组、字符串通用的取值语法,用于批量截取序列数据,格式:seq[start:end:step]。
6.1 切片完整规则
1、start:起始索引,默认0;
2、end:结束索引,左闭右开,默认末尾;
3、step:步长,默认1,支持正负,负数代表倒序截取。
6.2 实战案例
lst = [0, 1, 2, 3, 4, 5, 6]
print(lst[1:4]) # [1,2,3] 截取1~4左闭右开
print(lst[:3]) # 从头截取到索引3
print(lst[3:]) # 索引3截取到末尾
print(lst[::2]) # 步长2,隔一取一
print(lst[::-1]) # 切片反转(经典用法)
print(lst[-3:]) # 倒数三个元素
6.3 切片核心特性
1、切片取值不会越界报错,超出范围自动截断;
2、切片会生成新对象,修改切片结果不会影响原序列;
3、仅支持有序序列:字符串、列表、元组,字典、集合不支持切片。
七、列表推导式(高效生成列表)
列表推导式是 Python 极简高效语法,一行代码替代多层for循环,快速生成、筛选列表,可读性高、执行速度快。
7.1 基础语法与实战
# 基础格式:[表达式 for 变量 in 序列]
# 1、快速生成1-10列表
lst1 = [i for i in range(1, 11)]
print(lst1)
# 2、带条件筛选:1-10偶数
lst2 = [i for i in range(1, 11) if i % 2 == 0]
print(lst2)
# 3、表达式加工:数值平方
lst3 = [i**2 for i in range(1, 6)]
print(lst3)
# 4、双层循环推导
lst4 = [f"{a}{b}" for a in "ABC" for b in "123"]
print(lst4)
7.2 优缺点与规范
优点:代码简洁、底层C级循环、效率高于手动for追加。
缺点:逻辑过于复杂时可读性变差,不支持多层复杂逻辑。
规范:简单筛选、变换优先推导式,复杂逻辑使用普通循环。
八、生成器表达式(海量数据最优解)
生成器表达式语法和列表推导式几乎一致,将 [] 改为 (),不一次性生成全部数据,而是迭代时按需生成,极致节省内存。
8.1 基础对比实战
# 列表推导式:一次性加载所有数据到内存
lst = [i for i in range(100000)]
# 生成器表达式:仅创建迭代对象,不占用内存
gen = (i for i in range(100000))
# 遍历取值
for num in gen:
if num > 10:
break
print(num)
8.2 核心特性与区别
1、内存差异:列表推导式一次性加载全部数据,海量数据会内存溢出;生成器惰性求值,永久只占用极小内存;
2、取值差异:列表可任意索引、重复取值;生成器单向迭代、取完即空,不支持索引;
3、速度差异:小数据量列表更快,大数据量生成器碾压。
8.3 适用场景
1、超大文件读取、海量数据遍历;
2、流式数据处理、逐条消费场景;
3、只需遍历、无需索引重复取值的场景。
九、高频面试真题汇总
题目1:列表、元组、字典、集合的区别?
答案:列表有序可变可重复;元组有序不可变可重复;字典键值对、键唯一、3.7+有序;集合无序、元素唯一、自动去重,用于集合运算。
题目2:元组不可变为什么内部列表可以修改?
答案:元组不可变是元素引用地址不可变,内部列表地址未变,仅列表自身内容修改,不违反元组规则。
题目3:列表推导式和生成器表达式区别?
答案:列表推导式[]一次性生成全部数据,内存占用大、支持索引重复取值;生成器()惰性迭代、按需生成、极致省内存、单向迭代取完即空。
题目4:哪些类型可以作为字典key、集合元素?
答案:必须是不可变可哈希类型:数字、字符串、元组;列表、字典、集合可变不可哈希,无法使用。
十、全文终极背诵总结
1、列表list:万能可变有序容器,支持增删改查,适合频繁修改数据;
2、元组tuple:只读有序容器,数据安全、可哈希,嵌套可变对象内部可修改;
3、字典dict:哈希键值对,查询极速,key唯一且必须不可变;
4、集合set:无序唯一,主打去重、交集并集差集运算,无索引;
5、切片:序列通用截取规则,左闭右开、支持正负步长、不越界报错;
6、列表推导式:一行生成筛选列表,简洁高效,适合小数据量快速构造;
7、生成器表达式:惰性求值,省内存,海量数据遍历场景首选。