列表进阶:常用方法全景
在前面的课程中,我们已经见识了列表的基础索引与 append() 追加。但在实际工程与文本清洗中,我们需要对列表执行更丰富的增、删、查、改操作。Python 为列表对象提供了极其完备的内置方法(methods)。
核心方法一览表
假设已有列表 fruits = ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']:
list.append(x):在列表末尾添加一个元素。等价于a[len(a):] = [x];list.extend(iterable):通过追加可迭代对象中的所有元素来扩展列表。例如fruits.extend(['grape', 'peach']),注意它与append的区别:append把整个参数作为一个单一对象塞入末尾,而extend会把参数里的元素逐个解开放进去;list.insert(i, x):在指定位置插入一个元素。fruits.insert(0, 'mango')将芒果插入到列表最开头(0 号位);list.remove(x):从列表中删除第一个值为x的条目。若找不到指定值,则引发ValueError;list.pop([i]):删除指定位置的元素并返回该元素。如果不指定参数i,默认删除并返回最后一个元素;list.clear():清空列表中的所有元素,等价于del a[:];list.index(x[, start[, end]]):返回列表中第一个值为x的元素的从零开始的下标;list.count(x):统计元素x在列表中出现的总次数;list.sort(*, key=None, reverse=False):在原地对列表元素进行排序;list.reverse():在原地反转列表中的元素顺序;list.copy():返回列表的一个浅拷贝,等价于a[:]。
重要心智模型:原地修改返回 None 像
sort()和reverse()这样在原地修改列表内容的方法,它们的返回值都是None! 千万不要写fruits = fruits.sort(),这会把变量直接变成None。
列表用作堆栈(Stack)
堆栈(stack)是计算机科学中最经典的数据结构之一,其核心原则是后进先出(LIFO, Last-In, First-Out)——最后放入的元素最先被取出,就像一叠叠起来的盘子。
Python 的列表方法使得将列表用作堆栈极其简单自然:
- 入栈(push):使用
stack.append(x)将新元素压入栈顶(列表末尾); - 出栈(pop):使用
stack.pop()将栈顶最后放入的元素弹出来并返回:
>>> stack = [3, 4, 5]
>>> stack.append(6)
>>> stack.append(7)
>>> stack
[3, 4, 5, 6, 7]
>>> stack.pop()
7
>>> stack
[3, 4, 5, 6]
>>> stack.pop()
6
>>> stack.pop()
5
>>> stack
[3, 4]
由于 append() 和 pop() 都在列表末尾进行,操作效率极高。
列表推导式(List Comprehensions)
在日常编程中,我们经常需要创建一个新列表,里面的每个元素都是对另一个序列中各条目执行某种运算或筛选的结果。
比如,我们要计算 0 到 9 的平方数列表,传统写法是:
squares = []
for x in range(10):
squares.append(x**2)
这种写法不仅冗长,而且循环结束后变量 x 还会残留在当前作用域中。
Python 提供了极具表现力且广受欢迎的声明式语法——列表推导式(list comprehension):
squares = [x**2 for x in range(10)]
一行代码搞定!干净、优雅且执行效率更高。
结合 if 条件过滤
列表推导式的通用结构由方括号包围,包含一个表达式,其后紧随一个 for 子句,还可以有零个或多个 for 或 if 子句:
# 筛选出长度大于 3 的单词,并将它们转为大写:
words = ['cat', 'window', 'dog', 'defenestrate']
long_upper_words = [w.upper() for w in words if len(w) > 3]
print(long_upper_words)
# 输出: ['WINDOW', 'DEFENESTRATE']
它等价于:
long_upper_words = []
for w in words:
if len(w) > 3:
long_upper_words.append(w.upper())
多重 for 子句与平铺
列表推导式还可以在内部并列多个 for 子句:
>>> [(x, y) for x in [1, 2, 3] for y in [3, 1, 4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
嵌套的列表推导式
列表推导式还可以相互嵌套,常用于矩阵变换。例如对一个 的矩阵进行转置(行变成列):
matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
]
transposed = [[row[i] for row in matrix] for i in range(4)]
print(transposed)
# 输出: [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
del 语句:按索引或切片删除
前面学到的 pop() 方法会返回被删除的值。如果你仅仅想要从列表中彻底抹除某一个条目或某一段切片,可以使用 del 语句:
>>> a = [-1, 1, 66.25, 333, 333, 1234.5]
>>> del a[0] # 删除 0 号位
>>> a
[1, 66.25, 333, 333, 1234.5]
>>> del a[2:4] # 切片删除下标 2 和 3
>>> a
[1, 66.25, 1234.5]
>>> del a[:] # 清空整个列表内容
>>> a
[]
del 甚至可以直接删除整个变量名:del a,之后再次访问 a 就会触发 NameError。
掌握了列表的高级操作与列表推导式,我们处理批量数据的效率将成倍飞跃。下一关,我们将探索 Python 的其他核心数据结构:元组、集合与字典!