容器类型是Python处理数据的核心工具,掌握列表(List)、字典(Dict)、元组(Tuple)、集合(Set)这四类核心容器,能让你高效存储、遍历、操作数据——从简单的数据分析到复杂的业务逻辑开发,都离不开这些基础容器的灵活运用。本文从实战角度拆解四类容器的用法、区别和适用场景,解决新手「该用哪种容器」「怎么高效操作」的核心问题。
一、先理清:四类核心容器的核心定位
不同容器有不同的设计初衷,先明确各自的核心用途,避免用错场景:
| 容器类型 | 核心特征 | 核心用途 | 可变性 |
|---|---|---|---|
| 列表(List) | 有序、可重复、索引访问 | 存储有序数据(如用户列表、成绩列表) | 可变(可增删改) |
| 字典(Dict) | 键值对、无序(3.7+有序)、键唯一 | 存储关联数据(如用户信息、配置项) | 可变(可增删改键值对) |
| 元组(Tuple) | 有序、可重复、索引访问 | 存储不可修改的固定数据(如坐标、常量) | 不可变 |
| 集合(Set) | 无序、不可重复、哈希存储 | 去重、交集/并集等集合运算(如用户去重) | 可变(但元素不可变) |
二、列表(List):有序可变的「数据序列」
列表是Python最常用的容器,用[]定义,支持索引、切片、增删改查,适合存储有序且需要频繁修改的数据。
1. 基础定义与访问
定义列表(可存储不同类型数据,建议统一类型)
score_list = [90, 85, 95, 88]
user_list = ["张三", "李四", "王五"]索引访问(正索引从0开始,负索引从-1开始)
print(score_list[0]) 输出:90(第一个元素)
print(user_list[-1]) 输出:王五(最后一个元素)切片:获取子列表(左闭右开)
print(score_list[1:3]) 输出:[85, 95](索引1到2)
print(score_list[:2]) 输出:[90, 85](前2个元素)
2. 核心操作:增删改查
1. 新增元素
score_list.append(92) 末尾添加:[90, 85, 95, 88, 92]
score_list.insert(1, 89) 索引1处插入:[90, 89, 85, 95, 88, 92]2. 修改元素
score_list[2] = 86 索引2的值改为86:[90, 89, 86, 95, 88, 92]3. 删除元素
score_list.remove(95) 删除指定值:[90, 89, 86, 88, 92]
del score_list[-1] 删除索引-1的元素:[90, 89, 86, 88]
score_list.pop() 弹出末尾元素:[90, 89, 86]4. 查找元素
print(89 in score_list) 输出:True(判断是否存在)
print(score_list.index(89)) 输出:1(返回索引)
3. 实用技巧:列表推导式(简化创建)
生成1-10的偶数列表
even_list = [x for x in range(1, 11) if x % 2 == 0]
print(even_list) 输出:[2, 4, 6, 8, 10]
三、字典(Dict):键值对的「关联数据存储」
字典用{键:值}定义,键(Key)唯一且不可变(字符串、数字、元组),值(Value)可任意,适合存储「名称-值」关联的数据,比如用户信息、商品属性。
1. 基础定义与访问
定义字典
user_info = {"name": "张三","age": 28,"city": "北京","score": [90, 85] 值可以是列表
}访问值(通过键)
print(user_info["name"]) 输出:张三
print(user_info.get("age")) 输出:28(推荐,键不存在时返回None)键不存在时的处理
print(user_info.get("gender", "未知")) 输出:未知(指定默认值)
2. 核心操作:增删改查
1. 新增/修改键值对(键存在则修改,不存在则新增)
user_info["gender"] = "男" 新增:{"name":"张三", ..., "gender":"男"}
user_info["age"] = 29 修改:age变为292. 删除键值对
del user_info["score"] 删除score键
user_info.pop("city") 弹出city键,返回值:"北京"3. 遍历字典遍历键
for key in user_info.keys():print(key) 输出:name, age, gender遍历值
for value in user_info.values():print(value) 输出:张三, 29, 男遍历键值对(最常用)
for key, value in user_info.items():print(f"{key}:{value}")
3. 实用技巧:字典推导式
将两个列表转为字典(姓名-成绩)
names = ["张三", "李四"]
scores = [90, 85]
score_dict = {name: score for name, score in zip(names, scores)}
print(score_dict) 输出:{"张三":90, "李四":85}
四、元组(Tuple):不可变的「固定数据序列」
元组用()定义(也可省略括号),有序且不可修改,适合存储不需要变更的固定数据,比如坐标、函数返回多个值。
1. 基础定义与访问
定义元组
point = (10, 20) 坐标
color = "红", "绿", "蓝" 省略括号访问(和列表一样,索引/切片)
print(point[0]) 输出:10
print(color[:2]) 输出:('红', '绿')不可变特性(修改会报错)point[0] = 15 报错:TypeError: 'tuple' object does not support item assignment
2. 核心用途
1. 函数返回多个值(本质是元组)
def get_num():return 1, 2, 3a, b, c = get_num() 解包,a=1, b=2, c=32. 作为字典的键(列表不行,元组可以)
dict_with_tuple_key = {(1, 2): "坐标1",(3, 4): "坐标2"
}
五、集合(Set):无序去重的「数据集合」
集合用{}或set()定义,元素唯一且不可变,支持交集、并集、差集等集合运算,核心用途是去重和数据对比。
1. 基础定义与去重
定义集合(自动去重)
num_set = {1, 2, 2, 3, 3, 3}
print(num_set) 输出:{1, 2, 3}列表去重(转集合再转列表)
repeat_list = [1, 2, 2, 3]
unique_list = list(set(repeat_list))
print(unique_list) 输出:[1, 2, 3](顺序可能变化)
2. 核心操作:集合运算
定义两个集合
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}并集(a或b中的元素)
print(a | b) 输出:{1, 2, 3, 4, 5, 6}交集(a和b都有的元素)
print(a & b) 输出:{3, 4}差集(a有b没有的元素)
print(a - b) 输出:{1, 2}新增/删除元素
a.add(5) 新增:{1,2,3,4,5}
a.remove(2) 删除:{1,3,4,5}(元素不存在报错)
a.discard(6) 删除:无报错(元素不存在时)
六、四类容器的核心区别与选型建议
| 场景需求 | 推荐容器 | 原因 |
|---|---|---|
| 存储有序、需修改的数据 | 列表 | 有序、可变,支持增删改查 |
| 存储关联数据(名称-值) | 字典 | 键值对关联,按键快速查找 |
| 存储固定、不可修改的数据 | 元组 | 不可变,更安全,占用内存少 |
| 数据去重、集合运算 | 集合 | 自动去重,支持交并差运算 |
七、常见错误与解决方法
| 错误现象 | 根本原因 | 解决方法 |
|---|---|---|
KeyError: 'xxx' |
访问字典不存在的键 | 改用dict.get(key, 默认值) |
TypeError: 'tuple' object does not support item assignment |
修改元组元素 | 元组不可变,需修改则转为列表(list(tuple)) |
TypeError: unhashable type: 'list' |
用列表作为字典键/集合元素 | 换成元组(tuple(list)) |
| 集合去重后顺序混乱 | 集合无序 | 需保留顺序则用列表+遍历去重([x for i, x in enumerate(lst) if x not in lst[:i]]) |
八、实战案例:组合使用容器
存储多个学生信息(列表+字典)
students = [{"name": "张三","age": 28,"scores": {"语文": 90, "数学": 85}},{"name": "李四","age": 27,"scores": {"语文": 88, "数学": 92}}
]遍历并打印每个学生的数学成绩
for student in students:print(f"{student['name']} 数学成绩:{student['scores']['数学']}")输出:张三 数学成绩:85李四 数学成绩:92