Python 列表与元组
目录
学习目标
- 掌握列表的创建、访问、修改和常用操作
- 理解元组的不可变性和使用场景
- 学会列表排序、切片和嵌套操作
- 掌握列表推导式的基础用法
一、列表(list)
列表是 Python 中最常用的数据结构之一,它是一个有序、可变的元素集合。
1.1 创建列表
# 直接创建
fruits = ["apple", "banana", "cherry"]
numbers = [1, 2, 3, 4, 5]
mixed = [1, "hello", 3.14, True, [1, 2]] # 可以混合类型
# 空列表
empty = []
empty2 = list()
# 从其他可迭代对象创建
chars = list("Python") # ['P', 'y', 't', 'h', 'o', 'n']
range_list = list(range(5)) # [0, 1, 2, 3, 4]1.2 访问元素
fruits = ["apple", "banana", "cherry", "date", "elderberry"]
# 索引访问
print(fruits[0]) # apple
print(fruits[-1]) # elderberry(最后一个)
print(fruits[-2]) # date(倒数第二个)
# 切片
print(fruits[1:4]) # ['banana', 'cherry', 'date']
print(fruits[:3]) # ['apple', 'banana', 'cherry']
print(fruits[::2]) # ['apple', 'cherry', 'elderberry']
print(fruits[::-1]) # 反转列表1.3 修改列表
items = [10, 20, 30, 40]
# 修改元素
items[1] = 25
print(items) # [10, 25, 30, 40]
# 添加元素
items.append(50) # 末尾添加
print(items) # [10, 25, 30, 40, 50]
items.insert(0, 5) # 指定位置插入
print(items) # [5, 10, 25, 30, 40, 50]
items.extend([60, 70]) # 批量添加
print(items) # [5, 10, 25, 30, 40, 50, 60, 70]
# 删除元素
items.remove(25) # 按值删除(第一个匹配)
print(items) # [5, 10, 30, 40, 50, 60, 70]
del items[0] # 按索引删除
print(items) # [10, 30, 40, 50, 60, 70]
popped = items.pop() # 删除并返回最后一个
print(popped, items) # 70 [10, 30, 40, 50, 60]
items.pop(0) # 删除并返回指定位置
print(items) # [30, 40, 50, 60]
items.clear() # 清空列表
print(items) # []1.4 常用列表方法
nums = [3, 1, 4, 1, 5, 9, 2, 6]
# 查找
print(nums.index(5)) # 4(5 的位置)
print(nums.count(1)) # 2(1 出现次数)
print(9 in nums) # True
# 排序
nums.sort() # 原地排序
print(nums) # [1, 1, 2, 3, 4, 5, 6, 9]
nums.sort(reverse=True) # 降序
print(nums) # [9, 6, 5, 4, 3, 2, 1, 1]
# sorted() 返回新列表,不修改原列表
original = [3, 1, 4, 1, 5]
new_sorted = sorted(original)
print(original) # [3, 1, 4, 1, 5](不变)
print(new_sorted) # [1, 1, 3, 4, 5]
# 反转
nums = [1, 2, 3, 4]
nums.reverse()
print(nums) # [4, 3, 2, 1]
# 复制
a = [1, 2, 3]
b = a.copy() # 浅拷贝
# 或 b = a[:]
# 或 b = list(a)1.5 列表运算
a = [1, 2, 3]
b = [4, 5]
# 拼接
print(a + b) # [1, 2, 3, 4, 5]
# 重复
print(a * 2) # [1, 2, 3, 1, 2, 3]
# 长度
print(len(a)) # 3
# 最值
print(min(a), max(a)) # 1 3
print(sum(a)) # 6二、元组(tuple)
元组与列表类似,但它是不可变的。一旦创建,不能修改其内容。
2.1 创建元组
# 直接创建
t = (1, 2, 3)
print(type(t)) # <class 'tuple'>
# 单元素元组(必须加逗号!)
single = (5,) # 注意逗号
not_tuple = (5) # 这只是整数 5
print(type(single)) # <class 'tuple'>
print(type(not_tuple)) # <class 'int'>
# 括号可省略
t2 = 1, 2, 3 # 也是元组
# 从列表创建
t3 = tuple([1, 2, 3]) # (1, 2, 3)
# 空元组
empty = ()2.2 元组操作
t = ("apple", "banana", "cherry", "date")
# 访问(与列表相同)
print(t[0]) # apple
print(t[-1]) # date
print(t[1:3]) # ('banana', 'cherry')
# 元组不可变
# t[0] = "orange" # TypeError!
# 查找
print(t.index("cherry")) # 2
print(t.count("apple")) # 1
print("banana" in t) # True
# 元组运算
print(t + ("elderberry",)) # 拼接(注意单元素要逗号)
print(t * 2) # 重复
print(len(t)) # 长度2.3 元组解包
# 基本解包
coordinates = (10, 20)
x, y = coordinates
print(x, y) # 10 20
# 多变量交换
a, b = 1, 2
a, b = b, a # 无需临时变量
print(a, b) # 2 1
# 带 * 的解包
first, *rest = (1, 2, 3, 4, 5)
print(first) # 1
print(rest) # [2, 3, 4, 5]
first, *middle, last = (1, 2, 3, 4, 5)
print(middle) # [2, 3, 4]2.4 元组使用场景
# 1. 函数返回多个值
def get_stats(numbers):
return min(numbers), max(numbers), sum(numbers) / len(numbers)
minimum, maximum, average = get_stats([1, 2, 3, 4, 5])
print(minimum, maximum, average) # 1 5 3.0
# 2. 作为字典的键(列表不行)
locations = {
(0, 0): "原点",
(1, 0): "东",
(0, 1): "北",
}
print(locations[(1, 0)]) # 东
# 3. 数据记录(类似结构体)
person = ("Alice", 25, "Beijing")
name, age, city = person三、列表 vs 元组对比
| 特性 | 列表 list | 元组 tuple |
|---|---|---|
| 语法 | [1, 2, 3] |
(1, 2, 3) |
| 可变性 | 可变 | 不可变 |
| 性能 | 较慢 | 较快(内存占用小) |
| 安全性 | 数据可能被修改 | 数据安全(哈希可计算) |
| 用途 | 动态数据集合 | 固定数据记录、字典键 |
四、嵌套列表
# 二维列表(矩阵)
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# 访问
print(matrix[1][2]) # 6(第二行第三列)
# 遍历
for row in matrix:
for item in row:
print(item, end=" ")
print()
# 行转置(使用 zip)
transposed = list(zip(*matrix))
print(transposed) # [(1, 4, 7), (2, 5, 8), (3, 6, 9)]五、列表推导式
# 基本列表推导式
squares = [x ** 2 for x in range(10)]
print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# 带条件
evens = [x for x in range(20) if x % 2 == 0]
print(evens) # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
# 二维列表推导式
matrix = [[i * j for j in range(1, 4)] for i in range(1, 4)]
print(matrix) # [[1, 2, 3], [2, 4, 6], [3, 6, 9]]
# 扁平化
nested = [[1, 2], [3, 4], [5, 6]]
flat = [x for sublist in nested for x in sublist]
print(flat) # [1, 2, 3, 4, 5, 6]六、综合示例
"""
学生成绩管理系统
"""
students = [
("Alice", 85, 92, 78),
("Bob", 76, 88, 90),
("Charlie", 92, 95, 88),
("David", 65, 70, 72),
]
print("=" * 50)
print(f"{'姓名':<10} {'语文':>6} {'数学':>6} {'英语':>6} {'总分':>6} {'平均':>6}")
print("-" * 50)
for name, chinese, math, english in students:
total = chinese + math + english
average = total / 3
print(f"{name:<10} {chinese:>6} {math:>6} {english:>6} {total:>6} {average:>6.1f}")
print("=" * 50)
# 找出总分最高的学生
totals = [(name, sum(scores)) for name, *scores in students]
best = max(totals, key=lambda x: x[1])
print(f"\n最高分: {best[0]}, 总分: {best[1]}")
# 计算各科平均分
chinese_scores = [s[1] for s in students]
math_scores = [s[2] for s in students]
english_scores = [s[3] for s in students]
print(f"\n各科平均分:")
print(f" 语文: {sum(chinese_scores)/len(chinese_scores):.1f}")
print(f" 数学: {sum(math_scores)/len(math_scores):.1f}")
print(f" 英语: {sum(english_scores)/len(english_scores):.1f}")小结
- 列表是可变的有序集合,支持增删改查
- 元组是不可变的有序集合,性能更好,可做字典键
- 元组解包是 Python 中非常实用的特性
- 列表推导式
[x for x in iterable if condition]简洁高效 - 嵌套列表可以表示矩阵等多维数据结构
练习
- 创建一个包含 1-20 的列表,提取所有奇数并计算它们的和。
- 有一个元组
(1, 2, 3, 4, 5),将其转换为列表后在第二个位置插入99,再转回元组。 - 编写程序,判断一个列表是否对称(回文列表)。
- 使用列表推导式生成一个 5x5 的乘法表矩阵。
- 有两个列表
keys = ['a', 'b', 'c']和values = [1, 2, 3],将它们合并为一个字典(不使用zip()和dict()的组合)。