小黑板上的選單跟著季節換,擦錯一行就要耽誤一個早上。列表能保住順序,可增刪都要小心。南瓜拿鐵插進中間之後,選單變成了什麼樣?
列表儲存一組有序的值。列表是可變的,所以你可以添加、刪除和重新排序元素。索引從 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 道題,作答後立即看到解釋。