### 數(shù)據(jù)類(lèi)型詳解-字典
> 字典也是一種數(shù)據(jù)的集合,由鍵值對(duì)組成的數(shù)據(jù)集合纲岭,字典中的鍵不能重復(fù)
>
> 字典中的鍵必須是不可變的數(shù)據(jù)類(lèi)型拥刻,常用的鍵主要是:字符串怜瞒,整型父泳。般哼。。
### 字典的定義
+ 字典可以通過(guò)將以逗號(hào)分隔的 `鍵: 值` 對(duì)列表包含于花括號(hào)之內(nèi)來(lái)創(chuàng)建字典
+ 也可以通過(guò) [`dict`](https://docs.python.org/zh-cn/3.7/library/stdtypes.html#dict) 構(gòu)造器來(lái)創(chuàng)建
?`{'jack': 4098, 'sjoerd': 4127}` 或 `{4098: 'jack', 4127: 'sjoerd'}`
```python
# 1惠窄。 使用{}定義
vardict = {'a':1,'b':2,'c':2}
# 2蒸眠。 使用 dict(key=value,key=value) 函數(shù)進(jìn)行定義
vardict = dict(name='zhangsan',sex='男',age=22)
# 3。 數(shù)據(jù)類(lèi)型的轉(zhuǎn)換?dict(二級(jí)容器類(lèi)型) 列表或元組杆融,并且是二級(jí)容易才可以轉(zhuǎn)換
vardict = dict([['a',1],['b',2],['c',3]])?# {'a': 1, 'b': 2, 'c': 3}
# 4楞卡。zip壓縮函數(shù),dict轉(zhuǎn)類(lèi)型
var1 = [1,2,3,4]
var2 = ['a','b','c','d']
# 轉(zhuǎn)換的原理和上面的第三種 是一個(gè)原理
vardict = dict(zip(var1,var2))?# {1: 'a', 2: 'b', 3: 'c', 4: 'd'}
print(vardict)
```
### 字典的操作
```python
var1 = {'a': 1, 'b': 2, 'c': 3}
var2 = {1: 'a', 2: 'b', 3: 'c', 4: 'd'}
# res = var1 +?var2 # XXXX?TypeError
# res = var1 * 3 # xxxx TypeError
# 獲取元素
res = var1['a']
# 修改元素
res = var1['a'] = 111
# 刪除元素
del var1['a']
# 添加元素
var1['aa'] = 'AA'
# 如果字典中的key重復(fù)了脾歇,會(huì)被覆蓋
# var1['aa'] = 'aa'
```
### 成員檢測(cè)和獲取
```python
# 三 成員檢測(cè)和獲取?,只能檢測(cè)key蒋腮,不能檢測(cè)value
res = 'AA' in var1
res = 'AA' not in var1
# 獲取當(dāng)前字典的長(zhǎng)度 只能檢測(cè)當(dāng)前又多少個(gè)鍵值對(duì)
res = len(var1)
# 獲取當(dāng)前字典中的所有 key 鍵
res = var1.keys()
# 獲取字典中所有的 value 值
res = var1.values()
# 獲取當(dāng)前字典中所有 鍵值對(duì)
res = var1.items()
```
### 字典的遍歷
```python
# 四, 對(duì)字典進(jìn)行遍歷
# (1)在遍歷當(dāng)前的字典時(shí)藕各,只能獲取當(dāng)前的key
for i in var1:
??print(i) # 只能獲取 key
??print(var1[i]) # 通過(guò)字典的key獲取對(duì)應(yīng)value
#(2)遍歷字典時(shí)池摧,使用 items() 函數(shù),可以在遍歷中獲取key和value
for k,v in var1.items():
??print(k)?# 遍歷時(shí)的 key
??print(v)?# 遍歷時(shí)的 value
print('===='*20)
# (3) 遍歷字典的所有key
for k in var1.keys():
??print(k)
print('===='*20)
# (4) 遍歷字典的所有 value
for v in var1.values():
??print(v)
```
### 字典的相關(guān)函數(shù)
```python
#?字典相關(guān)函數(shù)
# len(字典) #獲取字典的鍵值對(duì)個(gè)數(shù)
# dict.keys() # 獲取當(dāng)前字典的所有key 鍵激况,組成的列表
# dict.values() # 獲取當(dāng)前字典的所有 value 值作彤,組成的列表
# dict.items() # 返回由字典項(xiàng) ((鍵, 值) 對(duì)) 組成的一個(gè)新視圖
# iter(d) 返回以字典的鍵為元素的迭代器。
vardict = {'a':1,'b':2,'c':3}
# dict.pop(key) # 通過(guò) key 從當(dāng)前字典中彈出鍵值對(duì)?刪除
# res = vardict.pop('a')
# dict.popitem()??LIFO: Last in, First out.后進(jìn)先出
# res = vardict.popitem()?# 把最后加入到字典中的鍵值對(duì)刪除并返回一個(gè)元組
# 使用key獲取字典中不存在元素乌逐,會(huì)報(bào)錯(cuò)
# print(vardict['aa'])
# 可以使用get獲取一個(gè)元素竭讳,存在則返回,不存在默認(rèn)返回None
# res = vardict.get('aa')
# res = vardict.get('aa','abc')
# dict.update(),更新字典,如果key存在浙踢,則更新绢慢,對(duì)應(yīng)的key不存在則添加
# vardict.update(a=11,b=22)
# vardict.update({'c':33,'d':44})
# dict.setdefault(key[,default])
# 如果字典存在鍵 key ,返回它的值洛波。
# 如果不存在胰舆,插入值為 default 的鍵 key ,并返回 default 奋岁。
# default 默認(rèn)為 None思瘟。
res = vardict.setdefault('aa','123')
print(res)
print(vardict)
```
### 字典推導(dǎo)式
```python
# 把字典中的鍵值對(duì)位置進(jìn)行交換 {'a':1,'b':2,'c':3}
vardict = {'a':1,'b':2,'c':3}
# 普通方法實(shí)現(xiàn) 字典中的鍵值交換?{1: 'a', 2: 'b', 3: 'c'}
newdict = {}
for k,v in vardict.items():
??newdict[v] = k
# print(newdict)
# 使用字典推導(dǎo)式完成?{1: 'a', 2: 'b', 3: 'c'}
newdict = {v:k for k,v in vardict.items()}
# print(newdict)
# 注意:以下推導(dǎo)式,返回的結(jié)果是一個(gè)集合闻伶,集合推導(dǎo)式
# newdict = {v for k,v in vardict.items()}
# print(newdict,type(newdict))
# 把以下字典中的是偶數(shù)的值滨攻,保留下來(lái),并且交換鍵值對(duì)的位置
vardict = {'a':1,'b':2,'c':3,'d':4}
# 普通方式完成?{2: 'b', 4: 'd'}
# newdict = {}
# for k,v in vardict.items():
#???if v % 2 == 0:
#?????newdict[v] = k
# print(newdict)
# 字典推導(dǎo)式完成?{2: 'b', 4: 'd'}
newdict = {v:k for k,v in vardict.items() if v % 2 == 0}
# print(newdict)
```