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  -1

1.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))             # 输出: 31

2.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. 自测问题

  1. 列表和元组的主要区别是什么?
  2. 如何创建只有一个元素的元组?
  3. 列表推导式的基本语法是什么?
  4. append() 和 extend() 有什么区别?
  5. 什么是元组解包?

7. 下集预告

下一集我们将学习Python的字典与集合!

参考资料

« 上一篇 Python函数(下) 下一篇 » Python字典与集合