高效地处理批量数据,需要掌握不同容器类型。这一章进入真正的“数据容器”世界。
Python 提供了多种容器类型,用来存储和管理一组数据。主要包括:序列(通用操作)、列表、元组、集合和字典。
一、序列—— 所有有序容器的共同特性
序列是一种可迭代、元素有序的容器类型。字符串、列表、元组都属于序列。
序列支持以下通用操作:
# 1.1 索引操作
序列中的每个元素都有位置编号(索引),从左往右从0 开始,从右往左从 -1 开始。
示例:
python
city = "Beijing"
print(city[0]) # 输出 B
print(city[-1]) # 输出 g
# 1.2 加和乘操作
- 加(+):连接两个序列
- 乘(*):重复序列多次
示例:
python
name1 = ["张三"]
name2 = ["李四"]
print(name1 + name2) # ['张三', '李四']
print(name1 * 3) # ['张三', '张三', '张三']
# 1.3 切片操作
语法:[start:end:step]
- start:开始索引(包含)
- end:结束索引(不包含)
- step:步长(可为负)
示例:
python
scores = [85, 92, 78, 90, 88]
print(scores[1:4]) # [92, 78, 90]
print(scores[:3]) # [85, 92, 78]
print(scores[2:]) # [78, 90, 88]
print(scores[::2]) # [85, 78, 88](步长为2)
print(scores[::-1]) # [88, 90, 78, 92, 85](反转)
# 1.4 成员测试
- in:检查元素是否在序列中
- not in:检查是否不在序列中
示例:
python
student_list = ["张三", "李四", "王五"]
print("张三" in student_list) # True
print("赵六" not in student_list) # True
二、列表—— 灵活多变的可变序列
列表(list)是可变的序列,可以随意增删改查元素。
# 2.1 创建列表
两种方式:
- 使用 list(iterable) 函数
- 使用方括号 [元素1, 元素2, ...]
示例:
python
# 方式1:从字符串转换
chars = list("abc") # ['a', 'b', 'c']
方式2:直接定义(推荐)
students = ["张三", "李四", "王五"]
empty_list = [] # 空列表
# 2.2 追加元素
- append(x):在末尾追加单个元素
- extend(t) 或 +:追加多个元素
示例:
python
grades = [85, 92]
grades.append(78) # [85, 92, 78]
grades.extend([90, 88]) # [85, 92, 78, 90, 88]
# 或用 + 运算符(会创建新列表)
grades = grades + [95] # [85, 92, 78, 90, 88, 95]
# 2.3 插入元素
insert(i, x):在索引 i 处插入元素 x,原元素后移。
示例:
python
scores = [85, 92, 88]
scores.insert(2, 78) # 在索引2处插入78 → [85, 92, 78, 88]
# 2.4 替换元素
直接对索引赋值即可。
示例:
python
grades = [85, 92, 78]
grades[1] = 95 # [85, 95, 78]
# 2.5 删除元素
- remove(x):删除第一个值为 x 的元素(若不存在会报错)
- pop(i):删除并返回索引 i 处的元素(默认最后一个)
- del lst[i]:删除索引 i 的元素
示例:
python
students = ["张三", "李四", "王五", "李四"]
students.remove("李四") # 删除第一个"李四" → ["张三", "王五", "李四"]
last = students.pop() # 删除最后一个元素,last="李四" → ["张三", "王五"]
del students[0] # 删除索引0 → ["王五"]
三、元组—— 不可变的序列
元组(tuple)与列表相似,但不可变——创建后不能修改(不能增删改)。通常用于保护数据或作为字典的键。
# 3.1 创建元组
- 使用 tuple(iterable) 函数
- 使用圆括号 (元素1, 元素2, ...),注意单元素元组需要加逗号
示例:
python
# 从列表转换
t1 = tuple(["张三", "李四", "王五"]) # ('张三', '李四', '王五')
# 直接定义
t2 = ("北京", "上海", "广州")
t3 = ("深圳",) # 单元素元组,逗号不能省略
t4 = () # 空元组
# 3.2 元组拆包
可以将元组的元素分别赋值给多个变量。
示例:
python
info = ("张三", 25, "北京")
name, age, city = info
print(name) # 张三
print(age) # 25
print(city) # 北京
# 用 * 收集剩余元素
first, *rest = (85, 92, 78, 90)
print(first) # 85
print(rest) # [92, 78, 90]
四、集合—— 无序且不重复
集合(set)是无序、元素唯一的可迭代容器。常用于去重和集合运算(并、交、差)。
# 4.1 创建集合
- 使用 set(iterable) 函数
- 使用花括号 {元素1, 元素2, ...}
示例:
python
# 从列表创建,自动去重
s1 = set(["张三", "李四", "张三", "王五"]) # {'张三', '李四', '王五'}
# 直接定义
s2 = {"北京", "上海", "广州"}
s3 = set() # 空集合(注意 {} 是空字典)
# 4.2 修改集合
- add(elem):添加元素(如果已存在则不操作)
- remove(elem):删除元素(不存在会报错)
- discard(elem):删除元素(不存在不报错)
- clear():清空集合
示例:
python
cities = {"北京", "上海"}
cities.add("广州") # {'北京', '上海', '广州'}
cities.add("上海") # 无变化
cities.remove("上海") # {'北京', '广州'}
cities.discard("深圳") # 无报错
cities.clear() # set()
# 4.3 集合运算
- 并集:| 或 union()
- 交集:& 或 intersection()
- 差集:- 或 difference()
- 对称差:^ 或 symmetric_difference()
示例:
python
A = {"语文", "数学", "英语"}
B = {"数学", "物理", "化学"}
print(A | B) # {'语文', '数学', '英语', '物理', '化学'}
print(A & B) # {'数学'}
print(A - B) # {'语文', '英语'}
print(A ^ B) # {'语文', '英语', '物理', '化学'}
五、字典—— 键值对映射
字典(dict)是可迭代、通过键访问值的可变容器。键必须唯一且不可变(通常用字符串、数字、元组),值可以是任意类型。
# 5.1 创建字典
- 使用 dict() 函数
- 使用花括号 {key1:value1, key2:value2, ...}
示例:
python
# 方式1:dict() + 键值对列表
d1 = dict([(102, "张三"), (105, "李四")]) # {102: '张三', 105: '李四'}
# 方式2:直接定义(推荐)
student_dict = {102: "张三", 105: "李四", 109: "王五"}
empty_dict = {} # 空字典
# 5.2 修改字典
- 添加/修改:dict[key] = value(键不存在则添加,存在则覆盖)
- 删除:del dict[key] 或 pop(key)
- 清空:clear()
示例:
python
student_dict = {102: "张三", 105: "李四"}
student_dict[109] = "王五" # 添加
student_dict[102] = "张伟" # 修改
del student_dict[105] # 删除键105
student_dict.clear() # 清空字典
# 5.3 访问字典视图
- keys():返回所有键的视图
- values():返回所有值的视图
- items():返回所有键值对(元组)的视图
案例(用户提供):
python
# coding=utf-8
# 代码文件:ch06/ch6_6.py
s_dict = {102:'张三', 105:'李四', 109:'王五'}
print('---遍历键---')
for s_id in s_dict.keys():
print('学号:' + str(s_id))
print('---遍历值---')
for s_name in s_dict.values():
print('学生:' + str(s_name))
print('---遍历键:值---')
for s_id, s_name in s_dict.items():
print('学号:{0} - 学生:{1}'.format(s_id, s_name))
输出:
---遍历键---
学号:102
学号:105
学号:109
---遍历值---
学生:张三
学生:李四
学生:王五
---遍历键:值---
学号:102 - 学生:张三
学号:105 - 学生:李四
学号:109 - 学生:王五
解析:
- .keys() 返回所有学号,用于遍历键。
- .values() 返回所有姓名,用于遍历值。
- .items() 返回 (键, 值) 元组,通过两个变量 s_id, s_name 拆包,方便同时获取键和值。
六、如何区分创建不同数据类型的符号?
很多初学者容易混淆[]、()、{} 的用途。记住以下口诀和对比:
口诀:
- 方括号 [ ] 是列表 —— 就像一个大方箱子,可以装很多东西,还能随便换(可变)。
- 圆括号 ( ) 是元组 —— 圆圆的像个蛋,一旦做成不能改(不可变)。
- 花括号 { } 有双胞胎 —— 没冒号是集合(元素单一),有冒号是字典(键值对)。
详细说明:
- [1, 2, 3] → 列表:方括号,元素用逗号分隔,可修改。
- (1, 2, 3) → 元组:圆括号,元素用逗号分隔,不可修改。注意单元素元组要加逗号 (1,)。
- {1, 2, 3} → 集合:花括号,元素直接写,无序、自动去重。
- {"a":1, "b":2} → 字典:花括号,里面是 键:值 对,中间有冒号。
空容器的区分:
- [] 空列表
- () 空元组
- set() 空集合(因为 {} 已被空字典占用)
- {} 空字典
记忆技巧:
- 空集合必须用 set(),因为它没有自己的花括号(被字典抢了)。
- 看见冒号 : 就是字典,没有冒号就是集合。
七、总结对比
以下列出四种容器的主要特征,无表格,便于阅读:
- 列表(list)
有序、可变、允许重复。
创建符号:[ ]
典型场景:需要频繁增删改的数据序列,如学生名单。
- 元组(tuple)
有序、不可变、允许重复。
创建符号:( )
典型场景:不可变的数据集合,如一周的天数、地理坐标。
- 集合(set)
无序、可变、不允许重复。
创建符号:{ }(但空集合用 set())
典型场景:去重、集合运算(交集、并集等)。
- 字典(dict)
无序(但Python 3.7+ 保留插入顺序)、可变、键不允许重复、值允许重复。
创建符号:{key:value}(有冒号)
典型场景:键值映射,如学号对应姓名。
下一章我们将学习字符串的进阶操作,让文本处理更得心应手。