# Dictionary ### Sprout Py2021 參考自 2020 @ robert1003 ---- 大家還記得List嗎? ```python= primes = [2, 3, 5, 7, 10] primes[4] = 11 print(primes[0]) ``` <span>index(整數)-> 元素<!-- .element: class="fragment" data-fragment-index="2" --></span> ---- 如果不想拿整數當index怎麼辦?像是... ```python= score["Ethan"] = 100 score["Robert"] = 87 print(score["Ethan"]) ``` <span>這時候就要靠 Dictionary<!-- .element: class="fragment" data-fragment-index="2" --></span> --- ## What's a Dictionary? ---- + 回想一下你知道的 Dictionary 的功能 + 把每個「字」對到他的「解釋」 ---- + Python 裡的 Dictionary 也是差不多的功能 + 只是把「字」跟「解釋」換成別的東西 ---- + 功能:把 key 對到 value + key 就像「字」 + value 就像「解釋」 + 跟 list 的差別 + list:必須拿**連續整數**當key + dict:可以拿不同型態當key,**資料不連續** ---- ## 題外話 + 在有些語言中叫做 map (ex. C++) + 怎麼做的呢?用 [雜湊(hash)](https://ithelp.ithome.com.tw/articles/10208884) + 今天不會講哦 + 有興趣可以看連結或自己查 --- ## 初始化 ---- ```python= my_dict = {} ``` 大括號代表dict <span> ```python= my_dict = {"Ethan" : 100, "Robert" : 87} ``` <!-- .element: class="fragment" data-fragment-index="1" --></span> <span>裡面會放dict的初始資料<!-- .element: class="fragment" data-fragment-index="1" --></span> <span>其中冒號前面的是key,冒號後面的是value i.e. key : value<!-- .element: class="fragment" data-fragment-index="2" --></span> ---- 每個東西都可以當 key 嗎? ```python my_dict = {[1, 2, 3]: 'a', [4, 5, 6]: 'b'} ``` <span> ``` Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list' ``` <!-- .element: class="fragment" data-fragment-index="1" --></span> ---- ### 小複習 ```python= my_list = [] my_tuple = () my_dict = {} ``` --- ## 屬性 ---- ```python my_dict = {"Ethan" : 100, "Robert" : 87} print(len(my_dict)) ``` dict的元素個數 <span> ```python 2 ``` <!-- .element: class="fragment" data-fragment-index="1" --></span> --- ## 取值 ---- ```python= my_dict = {"Ethan" : 100, "Robert" : 87} print(my_dict["Ethan"]) print(my_dict["Robert"]) print(my_dict["bearrrrrrro"]) ``` 都是對的嗎? bearrrrrrro好像沒有出現過欸 <span> ```python 100 87 --------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-1-34eaef53f35c> in <module>() 2 print(my_dict["Ethan"]) 3 print(my_dict["Robert"]) ----> 4 print(my_dict["bearrrrrrro"]) KeyError: 'bearrrrrrro' ``` <!-- .element: class="fragment" data-fragment-index="2" --></span> ---- 有沒有方法避免噴出KeyError呢? ---- ## in ```python=+ if "bearrrrrrro" in my_dict: # 不會進去這個 if print(my_dict["bearrrrrrro"]) ``` --- ## 新增or修改 ---- ```python=+ my_dict["bearrrrrrro"] = 200 print(my_dict) ``` 新增"bearrrrrrro"這個key然後assign給他新的value=200 <span> ```python {'Ethan': 100, 'Robert': 87, 'bearrrrrrro': 200} ``` <!-- .element: class="fragment" data-fragment-index="1" --></span> ---- ```python=+ my_dict["Robert"] = 78 print(my_dict) ``` 把"Robert"這個key對應到的value改成78 <span> ```python {'Ethan': 100, 'Robert': 78, 'bearrrrrrro': 200} ``` <!-- .element: class="fragment" data-fragment-index="1" --></span> ---- 有沒有發現新增跟修改好像長得一樣? (所以才放在一起啊 ---- ## Practice! [neoj 3055](https://neoj.sprout.tw/problem/3055) [neoj 5566](https://neoj.sprout.tw/problem/5566) --- ## 遍歷 ---- 方法一:for key in dict.keys ```python=+ for k in my_dict.keys(): print(k) ``` 遍歷的是key <span> ```python Ethan Robert bearrrrrrro ``` <!-- .element: class="fragment" data-fragment-index="2" --></span> ---- 方法二:for value in dict.values() ```python=+ for v in my_dict.values(): print(v) ``` 遍歷的是value <span> ```python 100 87 200 ``` <!-- .element: class="fragment" data-fragment-index="2" --></span> ---- 方法三:for key, value in dict.items() ```python=+ for k, v in my_dict.items(): print(k, v) ``` key跟value同時遍歷,其中裡面的元素是(key, value)的tuple <span> ```python Ethan 100 Robert 87 bearrrrrrro 200 ``` <!-- .element: class="fragment" data-fragment-index="2" --></span> --- ## 刪除 ---- ```python=+ my_dict.pop("Robert") print(my_dict) ``` 刪除指定的key和他對應到的value <span> ```python {'Ethan': 100, 'bearrrrrrro': 200} ``` <!-- .element: class="fragment" data-fragment-index="1" --></span> ---- ```python=+ my_dict["Robert"] = 78 my_dict["bearrrrrrro"] = 200 print(my_dict) my_dict.clear() print(my_dict) ``` 全部刪光光 <span> ```python {'Ethan': 100, 'Robert': 78, 'bearrrrrrro': 200} {} ``` <!-- .element: class="fragment" data-fragment-index="1" --></span> ---- ## Practice! [neoj 3035](https://neoj.sprout.tw/problem/3035) [neoj 3052](https://neoj.sprout.tw/problem/3052) [neoj 3054](https://neoj.sprout.tw/problem/3054) --- ## Q & A --- ## Homework! [neoj 3036](https://neoj.sprout.tw/problem/3036) --- ## Bonus! [neoj 3015](https://neoj.sprout.tw/problem/3015)
{"title":"Dictionary","metaMigratedAt":"2023-06-15T21:50:50.317Z","metaMigratedFrom":"YAML","breaks":true,"slideOptions":"{\"theme\":\"solarized\",\"transition\":\"none\"}","contributors":"[{\"id\":\"3c602f94-234c-4650-b532-65700a1dbe90\",\"add\":4823,\"del\":113}]"}
    373 views