目录

Python 列表与元组

学习目标

  • 掌握列表的创建、访问、修改和常用操作
  • 理解元组的不可变性和使用场景
  • 学会列表排序、切片和嵌套操作
  • 掌握列表推导式的基础用法

https://img.zhaojq.top/20260730221646922.jpg
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. 创建一个包含 1-20 的列表,提取所有奇数并计算它们的和。
  2. 有一个元组 (1, 2, 3, 4, 5),将其转换为列表后在第二个位置插入 99,再转回元组。
  3. 编写程序,判断一个列表是否对称(回文列表)。
  4. 使用列表推导式生成一个 5x5 的乘法表矩阵。
  5. 有两个列表 keys = ['a', 'b', 'c']values = [1, 2, 3],将它们合并为一个字典(不使用 zip()dict() 的组合)。