第 06 课 · 入门 · 18 分钟

Python 列表

保存有序集合,安全地修改它,并取出你需要的部分。

索引append 与 remove切片与排序

小黑板上的菜单跟着季节换,擦错一行就要耽误一个早上。列表能保住顺序,可增删都要小心。南瓜拿铁插进中间之后,菜单变成了什么样?

列表保存一组有序的值。列表是可变的,所以你可以添加、删除和重新排序元素。索引从 0 开始,切片可以复制一段范围,而不会改变原列表。 你还会比较别名与拷贝,并在 pop 和 remove 之间做选择。

按索引读取

用方括号和整数位置读取元素。第一个元素在索引 0。负索引从末尾开始数:-1 是最后一个。索引超出范围会触发 IndexError。

orders = ["拿铁", "摩卡", "茶"]
print(orders[0])
print(orders[-1])
print(len(orders))

索引与长度

添加、删除与切片

append 把一个元素加到末尾。remove 删除第一个匹配的值。切片复制一段范围:items[1:3] 返回索引 1 和 2,结束索引不包含。

orders = ["拿铁", "摩卡"]
orders.append("茶")
orders.remove("摩卡")
print(orders)
print(orders[0:2])

修改列表

排序与汇总

sort() 会原地修改列表并返回 None。sorted() 返回一个新的列表。sum 和 len 可以快速汇总数字列表。需要降序时使用 reverse=True。

prices = [6.0, 4.5, 3.25]
prices.sort()
print(prices)
print(sum(prices))
print(sorted(prices, reverse=True))

排序与汇总

切片是拷贝,赋值是别名

b = a 复制的是引用,不是列表。用 a[:] 或 list(a) 做浅拷贝。列表元素是数字或字符串时,浅拷贝够用;如果元素是字典,内层字典仍然共享。

orders = ["latte", "tea"]
alias = orders
copy = orders[:]
alias.append("mocha")
copy.append("water")
print(orders)
print(copy)
records = [{"id": 1}]
shallow = records[:]
shallow[0]["id"] = 99
print(records)

外层列表被复制,内层对象仍共享

按位置 pop,按值 remove

pop() 按位置删除并返回该值;remove() 删除第一个匹配值并返回 None。根据需要不要返回被删元素来选择。不要一边遍历列表一边删除;可以新建列表,或遍历副本。

queue = ["latte", "tea", "mocha"]
served = queue.pop(0)
print(served, queue)
queue.remove("mocha")
print(queue)

两种删除方法,两种契约

sorted() 返回新列表

sorted() 返回新列表;list.sort() 原地修改,返回 None。选择哪一个,取决于原来的顺序是否还要保留。两者都接受 key= 自定义排序,也接受 reverse=True 倒序。常见错误是写 prices = prices.sort(),结果把列表换成了 None。

prices = [4.5, 3.0, 2.25]
ascending = sorted(prices)
prices.sort(reverse=True)
print(ascending)
print(prices)

副本排序与原地排序

本课要点

  • 索引从 0 开始,负索引从末尾开始。
  • append 修改原列表,切片返回一个新列表。
  • 切片的结束索引不包含在结果中。
  • sort 会修改原列表并返回 None。
  • b = a 是别名;b = a[:] 只复制外层列表。
  • sorted() 复制后排序;list.sort() 原地修改并返回 None。

常见错误

  • 在只有三个元素的列表上访问 orders[3],触发 IndexError。
  • 写 orders = orders.append("茶"),结果把列表变成了 None。
  • 把 remove(value) 和 pop(index) 混淆。
  • 一边遍历列表一边删除元素。
  • 把 list.sort() 的返回值赋回变量,结果丢掉整个列表。
轮到你

从两个饮品开始,追加第三个,排序后打印第一个和最后一个。

动手试试

改改变量、先预测输出,再运行代码。第一次点击“运行代码”时会下载 Python 运行时,可能需要几秒钟。

浏览器内 Python本地运行 · 无需账号
首次运行会从 CDN 下载 Pyodide。修改后点击“运行代码”。

练习本课

12 道题,作答后立即看到解释。

查看 12 道题答案开始练习
← for 循环字典 →