Appearance
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() 深拷贝;+ 拼接,* 重复;嵌套列表拷贝要注意深浅问题。