# 字典與集合
###### tags: `人生苦短,我學Python`
## 字典特徵
:::info
字典和陣列類似,也是可變序列,但它是無序的,保存的內容是以「鍵:值」的形式存放的。
鍵是唯一的,但值可以有很多個。
:fire: 特徵如下
:heavy_check_mark: 透過鍵而不是透過所引來讀取
:heavy_check_mark: 無序
:heavy_check_mark: 可變,可任意嵌套
:heavy_check_mark: 鍵必須唯一
:heavy_check_mark: 鍵不可變
:::
## 字典的新增
* 定義字典時,每個元素都包含兩個部分--鍵、值,兩者使用「:」隔開,所有元素都放在一個大括號中
* 創建空字典
```python=
# 有兩種方法
name = {}
name = dict()
```
* 也可以使用zip()函數
```python=
# name = dict(zip(list1, list2))
name = ['rex', 'xia', 'zhan']
sign = ['up', 'down', '5566']
test = dict(zip(name, sign))
print(test)
# {'rex': 'up', 'xia': 'down', 'zhan': '5566'}
```
* 透過給定的鍵值創鍵字典
```python=
name = dict(id = "12345", email = "rex@gmail")
print(name)
# {'id': '12345', 'email': 'rex@gmail'}
```
* 也可以使用fromkeys()創建空字典
```python=
name = ['xia', 'rex']
test = dict.fromkeys(name)
print(test)
# {'xia': None, 'rex': None}
```
* 也可以使用已經存在的元組和陣列創建字典
```python=
# 元組:陣列、陣列:元組、元組:元組
name = ['xia', 'rex']
test = ('1', '2')
# (1)
dict1 = {test : name}
print(dict1)
# {('1', '2'): ['xia', 'rex']}
# (2)
dict2 = {name : test}
print(dict2)
# Traceback (most recent call last):
#File "C:\Users\a9132\Desktop\python\1.py", line 3, in <module>
#dict2 = {name : test}
#TypeError: unhashable type: 'list'
# (3)
dict3 = {test : test}
print(dict3)
# {('1', '2'): ('1', '2')}
```
## 刪除字典
```python=
dict_example = {'2':'3', '4','5'}
del dict_example
# 將字典內部清空
dict_example.clear()
```
:::warning
當然還有pop()、popitem()等方法。這邊可以自己試一下
:accept: dict.pop(keyword)
:accept: dict.popitem() 直接刪除末尾的key-value
:::
## 字典搜索
* 直接搜尋
```python=
name = {"1":"2", "3":"4"}
print(name["1"])
# 2
```
* 但實際在處理的時候,不一定會知道當前有什麼鍵......,比如可以這樣寫
```python=
name = {"1":"2", "3":"4"}
print(name["5"] if "5" in name else "查無此鍵")
# 查無此鍵
```
* 使用get()得到value
```python=
name = {"1" : "2", "3" : "4"}
get_value = name.get("1")
print(get_value)
# 2
none_keyword = name.get("5", "沒有此key值")
print(none_keyword)
# 沒有此key值
```
:::warning
在使用get()的時候,如果沒有找key,也就是key不存在的時候,得到的結果就是默認值
:::
## 遍歷字典
```python=
# 需要用dict.items()函式獲得字典的鍵值對列表
name = {"1" : "2", "3" : "4"}
for item in name.items():
print(item)
# ('1', '2')
# ('3', '4')
```
* 如果想要獲取具體的每個鍵和值......
```python=
name = {"1" : "2", "3" : "4", "5" : "6"}
for key, value in name.items():
print(key, " 的下一個是 ", value)
# 1 的下一個是 2
# 3 的下一個是 4
# 5 的下一個是 6
```
:::success
這邊也提供了values()、keys(),用於返回值、鍵
:key: keys()會返回 ["鍵值", "鍵", ......]
:tea: values()回返回 dict_values(["值", "值", ......])
:::
## 添加字典元素
* 因為字典是可變序列,所以可以隨時增加鍵-值對
```python=
name = {"1" : "2", "3" : "4", "5" : "6"}
name['7'] = '8'
print(name)
# {'1': '2', '3': '4', '5': '6', '7': '8'}
```
## 修改字典元素
```python=
name = {"1" : "2", "3" : "4", "5" : "6"}
name["1"] = '0'
print(name)
# {'1': '0', '3': '4', '5': '6'}
```
## 刪除字典元素
```python=
name = {"1" : "2", "3" : "4", "5" : "6"}
del name['1']
print(name)
# {'3': '4', '5': '6'}
```
## 字典生成式
* 可快速生成字典
```python=
import random
randdict = {i : random.randint(0, 100) for i in range(1, 5)}
print(randdict)
# {1: 35, 2: 88, 3: 38, 4: 77}
```
## 集合介紹
:::info
:+1: 集合分為兩種,可變集合、不可變集合,本文已可變集合為主,也就是set函數的應用
:::
## 創建集合
* 直接用 {} 創建
```python=
name = {1, 2, 3, 6, 5, 0}
print(name)
# {0, 1, 2, 3, 5, 6}
```
:::warning
set()是無序的,所以每次輸出的排序可能不同,不用在意
:::
* 使用set()函數建立
```python=
# setname = set(iteration)
name = set([1, 1, 2, 3, 4, 4])
print(name)
# {1, 2, 3, 4}
```
:::warning
當出現重複元素時,會刷掉
:::
## 往集合裡添加元素
* 使用add()函數
```python=
name = set([0, 1, 2, 3])
name.add(4)
print(name)
# {0, 1, 2, 3, 4}
```
## 在集合裡刪除元素
* 範例
```python=
name = set([0, 1, 2, 3, 4, 5])
name.remove(0)
print(name)
# {1, 2, 3, 4, 5}
name.pop()
print(name)
# {2, 3, 4, 5}
name.clear()
print(name)
# set()
```
## 使用交集、合集、差集運算
:::success
:cactus: 交集使用「&」
:cactus: 合集使用「|」
:cactus: 差集使用「-」
:cactus: 對稱差集使用「^」
:::
* 範例
```python=
name = set([0, 1, 2, 3])
example = set([0, 2, 3, 7])
print("交集: ", name & example)
# 交集: {0, 2, 3}
print("合集: ", name | example)
# 合集: {0, 1, 2, 3, 7}
print("差集: ", name - example)
# 差集: {1}
```
{%hackmd S1DMFioCO %}