Semorphe

四種容器

一個語言內建四種裝東西的方式。 · ⏱ 約 35 分鐘

你會學到三件事

  1. list / dict / set / tuple 各裝什麼、各長什麼樣
  2. 四種括號:[] {} {} ()
  3. 可變和不可變的差別

開始之前

C++ 的 vector / map / set 要 #include、要寫型別參數。

Python 這四種是內建的、有專屬語法的,所以它們是這個語言的日常, 不是「進階題材」。

🟢 先把編輯器打開,跟著下面一起做:跟著做

一、四種,一眼看完

四種放在一起比:

🔎 這一段是試一下——打了看結果就好,不要留在程式裡。

1nums  = [3, 1, 4]                    # list  ——有順序、可以重複、可以改2ages  = {"ming": 16, "hua": 17}      # dict  ——鍵 → 值3tags  = {"a", "b"}                   # set   ——不重複、沒順序4point = (1, 2)                       # tuple ——像 list,而【不能改】
314串列"ming"16鍵對應"hua"17鍵對應字典"a""b"集合12固定組合設定point為設定tags為設定ages為設定nums為1234
C++ 的對應 括號
list vector [ ]
dict map { 鍵: 值 }
set set { 值 }
tuple pair / tuple ( )

積木盤上它們各有一顆,寫著「串列」「字典」「集合」「固定組合」 ——最後那個就是 tuple(它「固定」在不能改)。

⚠️ dict 和 set 都用大括號。 分辨的方式是裡面有沒有冒號。

⚠️ {} 是空的 dict,不是空的 set。 空的 set 要寫 set()。

二、拿東西

拿的寫法都是方括號:

🔎 這一段是試一下——打了看結果就好,不要留在程式裡。

1print(nums[0])            # 32print(ages["ming"])       # 163print(point[1])           # 2
變數nums0取的變數ages"ming"取的變數point1取的印出印出印出123

list 和 tuple 用位置、dict 用鍵,而寫法一樣是方括號。

⚠️ set 不能用方括號拿,因為它沒有順序。它只回答「在不在裡面」:

🔎 這一段是試一下——打了看結果就好,不要留在程式裡。

1print("a" in tags)        # True
"a"變數tags在裡面:印出1

三、加東西

底下這幾顆在積木上是「在 … 末端加入 …」與「… 的長度」。

加的寫法各有各的:

🔎 這一段是試一下——打了看結果就好,不要留在程式裡。

1nums.append(5)            # list  →  [3, 1, 4, 5]2ages["new"] = 18          # dict  →  多一個鍵3tags.add("c")             # set   →  已經有的話不會變多
變數nums5變數ages"new"取的18變數tags"c"把加進集合把設成在末端加入123

⚠️ 三個名字都不一樣(append / []= / add),這是要背的。

len(x) 對四種都通:

🔎 這一段是試一下——打了看結果就好,不要留在程式裡。

1print(len(nums))          # 4
變數nums的長度印出1

四、⚠️ tuple 不能改

tuple 做好就不能改:

🚫 這一段是反例——課文在說不要這樣寫,別照著拉。

1point[0] = 9              # 💥 TypeError
變數point0取的9把設成1

這不是限制,是保證。

「不會被改」讓它可以當 dict 的鍵、可以安心傳來傳去。 座標、日期、一組回傳值,這些東西本來就不該中途變。

可變是能力,不可變是承諾。 需要承諾的地方用 tuple,需要能力的地方用 list。

完成的樣子

這一課的參考做法——程式碼每一行的號碼,就印在對應的那塊積木上。

1nums = [3, 1, 4]2ages = {"ming": 16, "hua": 17}3tags = {"a", "b"}4point = (1, 2)5print(nums[0])6print(ages["ming"])7nums.append(5)8print(len(nums))9print(len(tags))10print(point[1])
314串列"ming"16鍵對應"hua"17鍵對應字典"a""b"集合12固定組合變數nums0取的變數ages"ming"取的變數nums5變數nums的長度變數tags的長度變數point1取的印出印出印出在末端加入印出印出設定point為設定tags為設定ages為設定nums為12345678910

換你了

用一個 dict 記三個人的分數,然後印出分數最高的那個人的名字。

提示:for name in scores: 走過的是鍵。

到編輯器做這一題:練習:印出分數最高的那個人的名字

做一個

一串有重複的數字 [3, 1, 4, 1, 5, 9, 2, 6, 5, 3]。 印出原本幾個、去重之後幾個、以及排好的結果。

🔴 這一題用兩種容器:一種負責去重,一種負責保留順序。 ⚠️ 想一下為什麼不能只用其中一種。

到編輯器做這一題:做一個:去掉重複再排好

這一課你做了什麼

如果卡住了

你看到 多半是因為
{} 拿到的是 dict 不是 set 空的 set 要寫 set()
KeyError dict 裡沒有那個鍵。先用 in 問一下
TypeError: 'tuple' object does not support... tuple 不能改
set 裡的東西順序每次不一樣 set 本來就沒有順序
nums.add(5) 出錯 list 用 append,set 才用 add
在編輯器打開這一課 →