# Dictionary
繼續在資料結構的世界裡,把一堆各式 type 的資料裝在一起的方式,除了 list 和 string, tuple 以外,還可以用 dictionary
Dictionary 跟上述三種不同的地方在於,那三種都是把資料用水平一串(一條?)的概念來呈現,像是 index 也本身就是排排站的意味,但 dictionary 是索引的概念
Dictionary 是 Python 內建的特殊資料結構,(在其他語言可能要用其他方式或自己寫才能達到相同的效果),所有東西都是一對一對的,像字典一樣,每一個詞都有一個解釋,這個詞概念的東西稱為 key ,而配對到的解釋稱為 value
長這樣
``` python
mydict = {"twelve":12, "six":6, "twenty":20}
```
其中 `"twelve"`, `"six"`, 和 `"twenty"` 都是 key,type 是 string 的 key
`12`, `6`, 和 `20` 是 value,type 是 int 的 value
每一個 key 都配對到一個 value,key 不能重複,但 value 可以
要拿到一個 dictionary 裡面的值,不是像 list 一樣用 index by index 地查找,而是透過 key 來 directly access,像是
``` python
mydict = {"twelve":12, "six":6, "twenty":20}
print(mydict["six"])
```
如果 six 這個 key 不存在,就會獲得 `KeyError`
為了避免程式執行時出現不必要的 error 讓整個程式中斷,一個安全的 access dictionary 方式是透過 `dictionary.get()` 這個 function,如果 `.get()` 括號內的 key 存在,這個 function 就會回傳該 key 的 value,如果不存在,則回傳 None
試試:
``` python
mydict = {"twelve":12, "six":6, "twenty":20}
print(mydict.get("sixx"))
```
另一個 `.get()` 的酷用法是可以指定如果 key 不存在要回傳什麼,試試:
``` python
mydict = {"twelve":12, "six":6, "twenty":20}
print(mydict.get("sixx", "sad no key"))
```
<br></br>
當然 dictionary 的創建不需要在一開始就指定好,也可以跟 list 的 `.append()` 一樣慢慢擴增,試試:
``` python
mydict = {"twelve":12, "six":6, "twenty":20}
print(mydict)
mydict["one"] = 1
print(mydict)
```
---
另外,像所有其他資料結構一樣,dictionary 也可以用 loop 去 access,想想會印出什麼然後試試:
``` python
mylist = [1, 2, 3, 4, 5, 6, 7, 8, 9]
for i in mylist:
print(i)
#-------------------------------------
mydict = {"twelve":12, "six":6, "twenty":20}
for i in mydict:
print(i)
for i in mydict:
print(mydict[i])
```
更進階的可以試試:
``` python
mydict = {"twelve":12, "six":6, "twenty":20}
for i in mydict.items():
print(i)
for i, j in mydict.items():
print(j, i)
```
這樣就可以看出許多 dictionary 的特質囉
<br></br>
:::spoiler 小練習 with Turtle
來用 turtle 畫折線圖吧,先做一個 dictionary,讓 key 是 x 座標,value 是 y 座標,再讓烏龜畫出來吧
:::
<br></br>
:::spoiler 來寫個小複雜的東西吧
字典是個好東西,特別是翻譯的時候,現在已知有兩個 list -- 英文與西班牙文的單字列表,並且已知這兩個 list 的單字順序是一樣的,如下
``` python
eng_list = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"]
spa_list = ["uno", "dos", "tres", "cuatro", "cinco", "seis", "siete", "ocho", "nueve", "diez"]
arab_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
```
目標是知道這兩個語言,對於一樣意思的單字,字母數是否一樣,最後得到哪一個語言背單字比較容易的結論,所以要怎麼做到呢
:::
---
:::spoiler Additional readings
https://runestone.academy/ns/books/published/thinkcspy/Dictionaries/toctree.html
:::
<br></br>
:::info
[BACK](https://hackmd.io/@lhsueh1/python101)
:::