小黑板上的菜单跟着季节换,擦错一行就要耽误一个早上。列表能保住顺序,可增删都要小心。南瓜拿铁插进中间之后,菜单变成了什么样?
列表保存一组有序的值。列表是可变的,所以你可以添加、删除和重新排序元素。索引从 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 运行时,可能需要几秒钟。
练习本课
12 道题,作答后立即看到解释。