📋 06. 列表 list 详解

本章概述

学习 Python 列表的定义、操作和常用方法。 预计学习时间:60 分钟


6.1 列表定义

列表是有序、可变的容器,元素类型可以任意。

# 空列表
lst = []
lst = list()
 
# 有元素的列表
lst = [1, 2, 3, 4, 5]
lst = ["a", "b", "c"]
lst = [1, "hello", 3.14, True, [1,2,3]]  # 混合类型

列表特点

  • ✅ 有序(有索引)
  • ✅ 可变(可以增删改)
  • ✅ 可重复(元素可以重复)
  • ✅ 混合类型(元素类型可以不同)

6.2 列表索引和切片

和字符串完全一样,详见 字符串索引和切片

lst = ["a", "b", "c", "d", "e"]
 
lst[0]      # 'a'
lst[-1]     # 'e'
lst[1:4]    # ['b', 'c', 'd']
lst[::2]    # ['a', 'c', 'e']
lst[::-1]   # ['e', 'd', 'c', 'b', 'a'](反转)

列表是可变的,可以通过索引修改

lst = ["a", "b", "c"]
lst[0] = "A"
print(lst)  # ['A', 'b', 'c']
 
# 切片批量修改
lst[1:3] = ["B", "C"]
print(lst)  # ['A', 'B', 'C']

列表 vs 字符串

  • 列表:可变,可以修改元素
  • 字符串:不可变,不能修改单个字符

6.3 列表运算

# 拼接 +
[1,2] + [3,4]    # [1, 2, 3, 4]
 
# 重复 *
[1, 2] * 3       # [1, 2, 1, 2, 1, 2]
 
# 成员判断 in
3 in [1,2,3]     # True
 
# 长度 len()
len([1,2,3])     # 3
 
# 比较(按顺序逐个比较)
[1, 2, 3] < [1, 2, 4]  # True

6.4 列表方法大全

➕ 添加元素

lst = [1, 2, 3]
 
# append:末尾添加一个元素
lst.append(4)
print(lst)  # [1, 2, 3, 4]
 
# extend:末尾添加多个元素(把另一个列表拆开加进去)
lst.extend([5, 6])
print(lst)  # [1, 2, 3, 4, 5, 6]
 
# insert:指定位置插入
lst.insert(0, 0)  # 在索引0处插入0
print(lst)  # [0, 1, 2, 3, 4, 5, 6]

append vs extend

  • append(x):把 x 作为一个元素加进去
  • extend(x):把 x 作为可迭代对象,拆开每个元素加进去
lst = [1, 2]
lst.append([3, 4])   # [1, 2, [3, 4]]
lst.extend([3, 4])   # [1, 2, 3, 4]

➖ 删除元素

lst = ["a", "b", "c", "d", "e"]
 
# pop:删除并返回指定位置的元素(默认最后一个)
lst.pop()      # 'e'(删除最后一个)
print(lst)     # ['a', 'b', 'c', 'd']
lst.pop(0)     # 'a'(删除第一个)
print(lst)     # ['b', 'c', 'd']
 
# remove:删除第一个匹配的元素(不返回)
lst.remove("c")
print(lst)     # ['b', 'd']
 
# del:删除指定位置或切片(关键字,不是方法)
del lst[0]
print(lst)     # ['d']
del lst[:]     # 清空整个列表
 
# clear:清空列表
lst.clear()
print(lst)     # []

🔍 查找与统计

lst = ["a", "b", "c", "a", "b", "a"]
 
# index:查找元素的索引(找不到报错)
lst.index("b")     # 1(第一个b的位置)
lst.index("b", 2)  # 4(从索引2开始找)
 
# count:统计出现次数
lst.count("a")     # 3
 
# in:判断是否存在
"c" in lst         # True
"z" in lst         # False

🔄 排序与反转

lst = [3, 1, 4, 1, 5, 9, 2, 6]
 
# sort:原地排序(修改原列表)
lst.sort()
print(lst)  # [1, 1, 2, 3, 4, 5, 6, 9]
 
# 降序排序
lst.sort(reverse=True)
print(lst)  # [9, 6, 5, 4, 3, 2, 1, 1]
 
# 按自定义规则排序(按长度)
words = ["apple", "hi", "banana"]
words.sort(key=len)
print(words)  # ['hi', 'apple', 'banana']
 
# sorted:返回新的排序后的列表(不修改原列表)
lst = [3, 1, 4]
new_lst = sorted(lst)
print(lst)      # [3, 1, 4](原列表不变)
print(new_lst)  # [1, 3, 4]
 
# reverse:原地反转
lst = [1, 2, 3]
lst.reverse()
print(lst)  # [3, 2, 1]
 
# 切片反转(不修改原列表)
lst = [1, 2, 3]
new_lst = lst[::-1]
print(lst)      # [1, 2, 3]
print(new_lst)  # [3, 2, 1]

📋 复制

lst = [1, 2, 3]
 
# copy:浅拷贝
lst2 = lst.copy()
 
# 切片拷贝
lst3 = lst[:]
 
# list() 构造
lst4 = list(lst)

浅拷贝 vs 深拷贝

以上都是浅拷贝,如果列表中有嵌套的可变对象(如子列表),拷贝的是引用。 需要深拷贝请用 copy.deepcopy()

详见 易错点 - 列表复制的坑


6.5 列表遍历

lst = ["a", "b", "c"]
 
# 方式1:遍历元素
for item in lst:
    print(item)
 
# 方式2:带索引遍历
for i, item in enumerate(lst):
    print(i, item)
 
# 方式3:按索引遍历
for i in range(len(lst)):
    print(lst[i])

6.6 列表推导式

Python 特色

列表推导式是 Python 中非常优雅的语法,用一行代码生成列表。

基本格式

[表达式 for 变量 in 可迭代对象]
[表达式 for 变量 in 可迭代对象 if 条件]

示例

# 生成1-10的平方
squares = [x**2 for x in range(1, 11)]
# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
 
# 带条件:只保留偶数的平方
evens_square = [x**2 for x in range(10) if x % 2 == 0]
# [0, 4, 16, 36, 64]
 
# 多个循环
pairs = [(x, y) for x in [1,2] for y in [3,4]]
# [(1, 3), (1, 4), (2, 3), (2, 4)]
 
# 字符串处理
words = ["hello", "world", "python"]
lengths = [len(w) for w in words]  # [5, 5, 6]
upper_words = [w.upper() for w in words]  # ['HELLO', 'WORLD', 'PYTHON']

什么时候用列表推导式?

  • 需要对序列做转换/筛选时
  • 代码更简洁、更 Pythonic
  • 性能比 for 循环 + append 略好

6.7 嵌套列表(二维列表)

# 3行3列的矩阵
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
 
# 取元素
matrix[0][0]   # 1(第一行第一列)
matrix[1][2]   # 6(第二行第三列)
 
# 遍历二维列表
for row in matrix:
    for item in row:
        print(item)
 
# 列表推导式生成二维列表
matrix = [[i*j for j in range(1,4)] for i in range(1,4)]

6.8 其他常用操作

lst = [3, 1, 4, 1, 5, 9, 2, 6]
 
# 求和
sum(lst)        # 31
 
# 最大值、最小值
max(lst)        # 9
min(lst)        # 1
 
# 平均值
sum(lst) / len(lst)  # 3.875
 
# 列表拼接(不修改原列表)
lst1 = [1, 2]
lst2 = [3, 4]
lst3 = lst1 + lst2  # [1, 2, 3, 4]
 
# 重复
[0] * 5        # [0, 0, 0, 0, 0]

6.9 列表的常见坑

遍历列表时删除元素

正序遍历列表时删除元素,会导致索引错乱,漏掉一些元素。

# ❌ 错误:会漏掉元素
lst = [1, 2, 3, 4, 5]
for x in lst:
    if x % 2 == 0:
        lst.remove(x)
print(lst)  # [1, 3, 5]?不对,实际是 [1, 3, 5]... 等等
 
# ✅ 正确1:倒序遍历
for x in reversed(lst):
    ...
 
# ✅ 正确2:列表推导式生成新列表
lst = [x for x in lst if x % 2 != 0]

更多坑点见 易错点汇总 - 数据类型


🔗 相关章节


📝 我的笔记

在这里记录你的理解、疑问和练习代码

# 你的练习代码
 

✅ 本章检查清单

  • 掌握列表的定义和特点
  • 会使用索引和切片操作列表
  • 掌握列表的增删改查方法
  • 会对列表进行排序和反转
  • 理解列表推导式并会使用
  • 了解列表的常见坑点