列表与元组
掌握Python中最常用的序列类型
列表(List)
什么是列表
列表 是Python中最常用的数据结构,用于存储多个元素的有序集合。
# 创建列表
numbers = [1, 2, 3, 4, 5]
names = ["张三", "李四", "王五"]
mixed = [1, "hello", True, 3.14] # 可以混合类型
empty = [] # 空列表
列表特点
- 有序:元素有固定顺序
- 可变:可以修改、添加、删除元素
- 可重复:元素可以重复
- 可嵌套:可以包含其他列表
列表基本操作
访问元素
fruits = ["苹果", "香蕉", "橙子", "葡萄", "西瓜"]
# 索引访问(从0开始)
print(fruits[0]) # 苹果
print(fruits[2]) # 橙子
# 负索引(从末尾开始)
print(fruits[-1]) # 西瓜
print(fruits[-2]) # 葡萄
# 切片
print(fruits[1:3]) # ['香蕉', '橙子']
print(fruits[:3]) # ['苹果', '香蕉', '橙子']
print(fruits[2:]) # ['橙子', '葡萄', '西瓜']
print(fruits[::2]) # ['苹果', '橙子', '西瓜'] 步长为2
print(fruits[::-1]) # 反转列表
修改元素
fruits = ["苹果", "香蕉", "橙子"]
# 修改单个元素
fruits[0] = "草莓"
print(fruits) # ['草莓', '香蕉', '橙子']
# 修改多个元素
fruits[1:3] = ["芒果", "柠檬"]
print(fruits) # ['草莓', '芒果', '柠檬']
添加元素
fruits = ["苹果", "香蕉"]
# append:末尾添加单个元素
fruits.append("橙子")
print(fruits) # ['苹果', '香蕉', '橙子']
# insert:指定位置插入
fruits.insert(1, "草莓")
print(fruits) # ['苹果', '草莓', '香蕉', '橙子']
# extend:添加多个元素
fruits.extend(["葡萄", "西瓜"])
print(fruits) # ['苹果', '草莓', '香蕉', '橙子', '葡萄', '西瓜']
# + 连接列表
more_fruits = fruits + ["芒果", "柠檬"]
删除元素
fruits = ["苹果", "香蕉", "橙子", "葡萄", "西瓜"]
# remove:按值删除(第一个匹配)
fruits.remove("橙子")
print(fruits) # ['苹果', '香蕉', '葡萄', '西瓜']
# pop:按索引删除并返回
item = fruits.pop() # 删除最后一个
print(item) # 西瓜
item = fruits.pop(1) # 删除索引1
print(item) # 香蕉
# del:按索引删除
del fruits[0]
# clear:清空列表
fruits.clear()
列表常用方法
查找和统计
numbers = [1, 2, 3, 2, 4, 2, 5]
# index:查找元素位置
print(numbers.index(3)) # 2
print(numbers.index(2)) # 1(第一个匹配)
# count:统计出现次数
print(numbers.count(2)) # 3
# in:判断是否存在
print(3 in numbers) # True
print(10 in numbers) # False
排序
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
# sort:原地排序
numbers.sort()
print(numbers) # [1, 1, 2, 3, 4, 5, 6, 9]
# 降序排序
numbers.sort(reverse=True)
print(numbers) # [9, 6, 5, 4, 3, 2, 1, 1]
# sorted:返回新列表(不修改原列表)
original = [3, 1, 4, 1, 5]
sorted_list = sorted(original)
print(original) # [3, 1, 4, 1, 5] 不变
print(sorted_list) # [1, 1, 3, 4, 5]
# 按自定义规则排序
words = ["banana", "apple", "cherry"]
words.sort(key=len) # 按长度排序
print(words) # ['apple', 'banana', 'cherry']
其他方法
numbers = [1, 2, 3]
# copy:复制列表
copy_list = numbers.copy()
# reverse:反转
numbers.reverse()
print(numbers) # [3, 2, 1]
# len:长度
print(len(numbers)) # 3
# sum/max/min
print(sum(numbers)) # 6
print(max(numbers)) # 3
print(min(numbers)) # 1
列表推导式
基本语法
# [表达式 for 变量 in 可迭代对象]
# 生成平方数列表
squares = [x**2 for x in range(1, 6)]
print(squares) # [1, 4, 9, 16, 25]
# 等价于
squares = []
for x in range(1, 6):
squares.append(x**2)
带条件
# [表达式 for 变量 in 可迭代对象 if 条件]
# 筛选偶数
evens = [x for x in range(10) if x % 2 == 0]
print(evens) # [0, 2, 4, 6, 8]
# 筛选并转换
numbers = [1, -2, 3, -4, 5]
positive_squares = [x**2 for x in numbers if x > 0]
print(positive_squares) # [1, 9, 25]
嵌套推导式
# 二维列表
matrix = [[i*3+j for j in range(3)] for i in range(3)]
print(matrix)
# [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
# 展平二维列表
flat = [x for row in matrix for x in row]
print(flat) # [0, 1, 2, 3, 4, 5, 6, 7, 8]
元组(Tuple)
什么是元组
元组 是不可变的列表,创建后不能修改。
# 创建元组
point = (3, 4)
colors = ("red", "green", "blue")
single = (1,) # 单元素元组必须有逗号
empty = ()
# 也可以不用括号
coordinates = 1, 2, 3
print(type(coordinates)) # <class 'tuple'>
元组特点
- 有序:元素有固定顺序
- 不可变:创建后不能修改
- 可重复:元素可以重复
- 比列表更快:因为不可变
元组操作
colors = ("red", "green", "blue", "green")
# 访问元素
print(colors[0]) # red
print(colors[-1]) # green
print(colors[1:3]) # ('green', 'blue')
# 查找
print(colors.index("green")) # 1
print(colors.count("green")) # 2
# 不能修改!
# colors[0] = "yellow" # TypeError
# 长度
print(len(colors)) # 4
# 遍历
for color in colors:
print(color)
元组解包
# 基本解包
point = (3, 4)
x, y = point
print(f"x={x}, y={y}") # x=3, y=4
# 多变量解包
a, b, c = (1, 2, 3)
# 使用*收集剩余元素
first, *rest = (1, 2, 3, 4, 5)
print(first) # 1
print(rest) # [2, 3, 4, 5]
# 函数返回多值
def get_point():
return (10, 20)
x, y = get_point()
列表 vs 元组
| 特性 | 列表 List | 元组 Tuple |
|---|---|---|
| 语法 | [1, 2, 3] | (1, 2, 3) |
| 可变性 | 可变 | 不可变 |
| 性能 | 较慢 | 较快 |
| 内存 | 较大 | 较小 |
| 用途 | 需要修改的数据 | 固定数据、字典键 |
何时用元组
# 1. 函数返回多个值
def get_user():
return ("张三", 25, "北京")
# 2. 字典的键(列表不行)
locations = {
(0, 0): "原点",
(1, 0): "东",
(0, 1): "北"
}
# 3. 不应该被修改的数据
COLORS = ("red", "green", "blue")
实战示例
示例1:成绩管理
# 学生成绩列表
scores = [85, 92, 78, 90, 88]
# 添加成绩
scores.append(95)
# 计算统计信息
print(f"总人数:{len(scores)}")
print(f"最高分:{max(scores)}")
print(f"最低分:{min(scores)}")
print(f"平均分:{sum(scores)/len(scores):.2f}")
# 及格人数
passed = len([s for s in scores if s >= 60])
print(f"及格人数:{passed}")
示例2:二维数据
# 学生信息(姓名,年龄,成绩)
students = [
("张三", 20, 85),
("李四", 21, 92),
("王五", 19, 78)
]
# 按成绩排序
students_sorted = sorted(students, key=lambda x: x[2], reverse=True)
for name, age, score in students_sorted:
print(f"{name}: {score}分")
练习
练习1:列表操作
# 给定列表,完成以下操作
numbers = [5, 2, 8, 1, 9, 3, 7]
# 1. 添加元素6到末尾
# 2. 删除元素1
# 3. 排序(升序)
# 4. 反转
# 参考答案
numbers.append(6)
numbers.remove(1)
numbers.sort()
numbers.reverse()
print(numbers)
练习2:列表推导式
# 使用列表推导式生成1-100中能被3整除的数
result = [x for x in range(1, 101) if x % 3 == 0]
print(result)
本章小结
- 列表:可变、有序、可重复
- 列表操作:append、insert、remove、pop、sort
- 列表推导式:简洁的列表生成方式
- 元组:不可变的列表
- 解包:方便地获取元素
下一步
学会了列表和元组,下一章学习字典与集合。
→ 继续阅读:20-字典与集合