跳到主要内容

列表与元组

掌握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)

本章小结

  1. 列表:可变、有序、可重复
  2. 列表操作:append、insert、remove、pop、sort
  3. 列表推导式:简洁的列表生成方式
  4. 元组:不可变的列表
  5. 解包:方便地获取元素

下一步

学会了列表和元组,下一章学习字典与集合。

→ 继续阅读:20-字典与集合