# 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}]"}