Python列表与元组
学习目标
通过本集的学习,你将能够:
- 理解列表和元组的概念
- 掌握列表的基本操作
- 理解元组的特点和用途
- 使用列表推导式高效创建列表
- 选择合适的序列类型
1. 列表是什么?
列表是Python中最常用的数据结构之一,它是一个有序、可变的元素集合。
1.1 创建列表
# 空列表
empty_list = []
print(empty_list) # 输出: []
# 包含元素的列表
numbers = [1, 2, 3, 4, 5]
print(numbers) # 输出: [1, 2, 3, 4, 5]
# 混合类型的列表
mixed = [1, "hello", 3.14, True]
print(mixed) # 输出: [1, 'hello', 3.14, True]
# 嵌套列表(二维列表)
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
print(matrix)列表的ASCII图表示:
列表: [10, 20, 30, 40, 50]
索引: 0 1 2 3 4
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
┌───┬───┬───┬───┬───┐
│10 │20 │30 │40 │50 │
└───┴───┴───┴───┴───┘
负索引: -5 -4 -3 -2 -11.2 访问列表元素
fruits = ["apple", "banana", "cherry", "date"]
# 正向索引(从0开始)
print(fruits[0]) # 输出: apple
print(fruits[2]) # 输出: cherry
# 负向索引(从-1开始)
print(fruits[-1]) # 输出: date
print(fruits[-2]) # 输出: cherry
# 切片
print(fruits[1:3]) # 输出: ['banana', 'cherry']
print(fruits[:2]) # 输出: ['apple', 'banana']
print(fruits[2:]) # 输出: ['cherry', 'date']
print(fruits[:]) # 输出: 全部
print(fruits[::2]) # 输出: ['apple', 'cherry'](步长为2)
print(fruits[::-1]) # 输出: 倒序2. 列表的基本操作
2.1 修改元素
numbers = [1, 2, 3, 4, 5]
# 修改单个元素
numbers[0] = 10
print(numbers) # 输出: [10, 2, 3, 4, 5]
# 修改切片
numbers[1:3] = [20, 30]
print(numbers) # 输出: [10, 20, 30, 4, 5]2.2 添加元素
fruits = ["apple", "banana"]
# append:在末尾添加
fruits.append("cherry")
print(fruits) # 输出: ['apple', 'banana', 'cherry']
# insert:在指定位置插入
fruits.insert(1, "date")
print(fruits) # 输出: ['apple', 'date', 'banana', 'cherry']
# extend:添加多个元素
fruits.extend(["elderberry", "fig"])
print(fruits) # 输出: ['apple', 'date', 'banana', 'cherry', 'elderberry', 'fig']
# 使用 + 运算符
more_fruits = fruits + ["grape", "honeydew"]
print(more_fruits)2.3 删除元素
fruits = ["apple", "banana", "cherry", "date", "banana"]
# remove:删除第一个匹配的元素
fruits.remove("banana")
print(fruits) # 输出: ['apple', 'cherry', 'date', 'banana']
# pop:删除指定位置的元素并返回
popped = fruits.pop(2)
print(popped) # 输出: date
print(fruits) # 输出: ['apple', 'cherry', 'banana']
# pop() 默认删除最后一个
last = fruits.pop()
print(last) # 输出: banana
print(fruits) # 输出: ['apple', 'cherry']
# del:删除元素或整个列表
del fruits[0]
print(fruits) # 输出: ['cherry']
# clear:清空列表
fruits.clear()
print(fruits) # 输出: []2.4 列表方法
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
# 查找
print(numbers.index(5)) # 输出: 4(查找元素位置)
print(numbers.count(1)) # 输出: 2(统计出现次数)
# 排序
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]
# 反转
numbers.reverse()
print(numbers) # 输出: [1, 1, 2, 3, 4, 5, 6, 9]
# 复制
copy1 = numbers.copy()
copy2 = list(numbers)
copy3 = numbers[:]
print(copy1)
# 长度、最大值、最小值、求和
print(len(numbers)) # 输出: 8
print(max(numbers)) # 输出: 9
print(min(numbers)) # 输出: 1
print(sum(numbers)) # 输出: 312.5 列表遍历
fruits = ["apple", "banana", "cherry"]
# 基本遍历
for fruit in fruits:
print(fruit)
# 带索引遍历
for i, fruit in enumerate(fruits):
print(f"{i}: {fruit}")
# 列表推导式
lengths = [len(fruit) for fruit in fruits]
print(lengths) # 输出: [5, 6, 6]3. 列表推导式
列表推导式是一种简洁高效创建列表的方式。
3.1 基本语法
# 基本列表推导式
squares = [x * x for x in range(10)]
print(squares) # 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# 等价的for循环
squares = []
for x in range(10):
squares.append(x * x)3.2 带条件的列表推导式
# 只保留偶数的平方
even_squares = [x * x for x in range(10) if x % 2 == 0]
print(even_squares) # 输出: [0, 4, 16, 36, 64]
# 多个条件
filtered = [x for x in range(30) if x % 2 == 0 and x % 3 == 0]
print(filtered) # 输出: [0, 6, 12, 18, 24]3.3 嵌套列表推导式
# 矩阵转置
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
transposed = [[row[i] for row in matrix] for i in range(3)]
print(transposed)
# 输出: [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
# 扁平化列表
nested = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]
flattened = [num for sublist in nested for num in sublist]
print(flattened) # 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9]列表推导式的ASCII图:
[ 表达式 for 变量 in 序列 if 条件 ]
│ │ │ │
│ │ │ └─ 可选:过滤条件
│ │ │
│ │ └─ 迭代的序列
│ │
│ └─ 迭代变量
│
└─ 每个元素的计算方式4. 元组的特点
元组是有序、不可变的元素集合。
4.1 创建元组
# 空元组
empty_tuple = ()
print(empty_tuple) # 输出: ()
# 单元素元组(注意逗号)
single = (42,)
print(single) # 输出: (42,)
print(type(single)) # 输出: <class 'tuple'>
# 多元素元组
point = (10, 20)
print(point) # 输出: (10, 20)
# 可以省略括号
colors = "red", "green", "blue"
print(colors) # 输出: ('red', 'green', 'blue')
# 使用tuple()创建
numbers = tuple([1, 2, 3])
print(numbers) # 输出: (1, 2, 3)4.2 元组操作
point = (10, 20, 30)
# 访问元素(与列表相同)
print(point[0]) # 输出: 10
print(point[-1]) # 输出: 30
print(point[1:]) # 输出: (20, 30)
# 元组解包
x, y, z = point
print(x, y, z) # 输出: 10 20 30
# 交换变量
a, b = 1, 2
a, b = b, a
print(a, b) # 输出: 2 1
# 元组拼接
t1 = (1, 2)
t2 = (3, 4)
t3 = t1 + t2
print(t3) # 输出: (1, 2, 3, 4)
# 元组重复
t4 = t1 * 3
print(t4) # 输出: (1, 2, 1, 2, 1, 2)4.3 元组的不可变性
# 元组不可修改
t = (1, 2, 3)
# t[0] = 10 # 错误:TypeError
# 但元组中的可变元素可以修改
t = ([1, 2], [3, 4])
t[0].append(3)
print(t) # 输出: ([1, 2, 3], [3, 4])4.4 列表 vs 元组
# 何时使用列表:
# - 需要修改数据
# - 需要添加/删除元素
# - 同类型数据的集合
shopping_list = ["牛奶", "面包", "鸡蛋"]
shopping_list.append("苹果")
# 何时使用元组:
# - 数据不应改变
# - 作为字典的键
# - 函数返回多个值
coordinates = (10.5, 20.3)
person = ("张三", 25, "北京")
def get_size():
width = 100
height = 200
return width, height # 返回元组
w, h = get_size()5. 实用案例
5.1 案例1:学生成绩管理
# student_grades.py
# 使用列表存储学生信息
students = [
{"name": "张三", "grades": [85, 90, 78]},
{"name": "李四", "grades": [92, 88, 95]},
{"name": "王五", "grades": [76, 82, 80]}
]
def calculate_average(grades):
"""计算平均分"""
return sum(grades) / len(grades)
# 计算每个学生的平均分
for student in students:
avg = calculate_average(student["grades"])
student["average"] = avg
print(f"{student['name']}: 平均分 {avg:.1f}")
# 找出最高分学生
top_student = max(students, key=lambda s: s["average"])
print(f"\n最高分学生: {top_student['name']} - {top_student['average']:.1f}")
# 使用列表推导式获取所有平均分
averages = [s["average"] for s in students]
print(f"班级平均分: {sum(averages) / len(averages):.1f}")5.2 案例2:矩阵运算
# matrix_operations.py
def print_matrix(matrix):
"""打印矩阵"""
for row in matrix:
print(row)
def matrix_add(a, b):
"""矩阵加法"""
return [[a[i][j] + b[i][j] for j in range(len(a[0]))]
for i in range(len(a))]
def matrix_multiply(a, b):
"""矩阵乘法"""
m = len(a)
n = len(b[0])
p = len(b)
return [[sum(a[i][k] * b[k][j] for k in range(p))
for j in range(n)]
for i in range(m)]
# 测试
A = [
[1, 2],
[3, 4]
]
B = [
[5, 6],
[7, 8]
]
print("矩阵A:")
print_matrix(A)
print("\n矩阵B:")
print_matrix(B)
print("\nA + B:")
print_matrix(matrix_add(A, B))
print("\nA * B:")
print_matrix(matrix_multiply(A, B))5.3 案例3:待办事项列表
# todo_list.py
class TodoList:
def __init__(self):
self.items = []
def add(self, task):
"""添加任务"""
self.items.append({"task": task, "done": False})
def mark_done(self, index):
"""标记完成"""
if 0 <= index < len(self.items):
self.items[index]["done"] = True
def remove(self, index):
"""删除任务"""
if 0 <= index < len(self.items):
self.items.pop(index)
def show(self):
"""显示所有任务"""
if not self.items:
print("任务列表为空")
return
for i, item in enumerate(self.items):
status = "✓" if item["done"] else "○"
print(f"{i}. [{status}] {item['task']}")
def get_pending(self):
"""获取待完成任务"""
return [item["task"] for item in self.items if not item["done"]]
# 使用
todo = TodoList()
todo.add("学习Python")
todo.add("完成作业")
todo.add("锻炼身体")
print("初始任务列表:")
todo.show()
todo.mark_done(0)
print("\n标记第一个任务完成:")
todo.show()
print("\n待完成任务:", todo.get_pending())6. 自测问题
- 列表和元组的主要区别是什么?
- 如何创建只有一个元素的元组?
- 列表推导式的基本语法是什么?
- append() 和 extend() 有什么区别?
- 什么是元组解包?
7. 下集预告
下一集我们将学习Python的字典与集合!
参考资料
- Python官方文档: https://docs.python.org/3/tutorial/datastructures.html
- 《Python编程:从入门到实践》