Skip to content

07|列表

列表是 Python 中最常用的序列类型。它有序、可变、可以容纳任意类型的元素。处理一批同类数据时,列表是首选容器。

一、创建列表

python
# 字面量
numbers = [1, 2, 3, 4, 5]
mixed = [1, "hello", 3.14, True]   # 元素类型可以不同

# 空列表
empty = []
empty = list()

# 从其他序列创建
chars = list("hello")   # ['h', 'e', 'l', 'l', 'o']

二、索引与切片

列表的索引和切片语法与字符串完全相同:

python
items = ["a", "b", "c", "d", "e"]

items[0]       # 'a'
items[-1]      # 'e'
items[1:3]     # ['b', 'c'],左闭右开
items[:3]      # ['a', 'b', 'c']
items[3:]      # ['d', 'e']
items[::2]     # ['a', 'c', 'e'],步长为 2
items[::-1]    # ['e', 'd', 'c', 'b', 'a'],反转

列表切片返回新列表。items[:] 是复制整个列表的常用写法。

三、增删改

python
items = ["a", "b"]

# 添加
items.append("c")           # ['a', 'b', 'c'],末尾添加
items.insert(1, "x")        # ['a', 'x', 'b', 'c'],在索引 1 处插入
items.extend(["d", "e"])    # ['a', 'x', 'b', 'c', 'd', 'e'],批量添加

# 删除
items.pop()                 # 删除并返回最后一个,默认索引 -1
items.pop(1)                # 删除并返回索引 1 的元素
items.remove("x")           # 删除第一个匹配的值,找不到抛 ValueError
del items[0]                # 删除索引 0 的元素
items.clear()               # 清空列表

append()extend() 的区别:

python
a = [1, 2]
a.append([3, 4])    # [1, 2, [3, 4]],把列表当作一个元素添加

b = [1, 2]
b.extend([3, 4])    # [1, 2, 3, 4],把列表的元素逐个添加

四、排序

python
nums = [3, 1, 4, 1, 5]

nums.sort()              # 原地排序,返回 None
nums.sort(reverse=True)  # 降序

sorted(nums)             # 返回新列表,原列表不变
sorted(nums, reverse=True)

按自定义规则排序:

python
words = ["banana", "pie", "Washington"]
words.sort(key=len)      # ['pie', 'banana', 'Washington'],按长度排序

key 参数接收一个函数,sort() 用这个函数的返回值作为排序依据。不改变元素本身的值。

五、查找与统计

python
items = ["a", "b", "c", "b"]

items.index("b")     # 1,第一个匹配项的索引,找不到抛 ValueError
items.count("b")     # 2,出现次数
"a" in items         # True
"x" in items         # False

六、列表运算

python
a = [1, 2]
b = [3, 4]

a + b        # [1, 2, 3, 4],拼接
a * 3        # [1, 2, 1, 2, 1, 2],重复

列表没有减法运算。要移除另一个列表的元素,需要用循环或推导式。

七、嵌套列表

列表的元素可以是另一个列表:

python
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
]

matrix[0]       # [1, 2, 3]
matrix[0][1]    # 2

复制嵌套列表要注意深浅拷贝的问题。matrix[:] 只复制了外层列表,内层列表仍然是引用:

python
copy = matrix[:]
copy[0][0] = 99
print(matrix[0][0])   # 99,原列表也被改了

需要完全独立的副本时,用 copy.deepcopy()

python
import copy
deep = copy.deepcopy(matrix)
deep[0][0] = 99
print(matrix[0][0])   # 1,原列表不受影响

记忆锚点:列表有序可变,append 加单个元素,extend 批量添加;sort() 原地排序,sorted() 返回新列表;a[:] 浅拷贝,copy.deepcopy() 深拷贝;+ 拼接,* 重复;嵌套列表拷贝要注意深浅问题。