# 字典 Dict
`Dict`用`{ }`表示,是可變的,且可存儲任意類型對象,其概念基于生活中的字典原型,使用『名稱-內容』對數據進行構建。
## 特點
* 字典中的數據必須以鍵值對(key-value)形式出現
* 鍵不可重復(鍵重復時,只會記住該鍵對應的最后一個值);值可重復
* 鍵(key)是不可變對象,不能進行修改;值(value)是可以修改的,可以是任意對象
## 基礎操作
`Dict`根據`key`來計算`value`的存儲位置。如果`key`可變,每次計算相同`key`得出的結果不同,那`Dict`內部就亂套了。
```python
# 鍵必須不可變,所以可以用數字,字符串或元組充當,所以用列表就不行
dict1 = {'name':'Tommy', 'age':25, 'sex':'male', 'extra':'unmarried'}
dict2 = {38.5:'Today is hot', ('x','y'):(1,2)}
print('dict1:', dict1)
print('dict2:', dict2)
# 訪問某個元素
print("dict1里的name dict1['name']:", dict1['name'])
print("dict2里的('x','y') dict2[('x','y')]:", dict2[('x','y')])
# 修改某個元素
dict1['age'] = 26
print("修改dict1里的age為26 dict1['age'] = 26:", dict1)
# 刪除某個元素
del(dict1['extra'])
print("刪除dict1里的extra del(dict1['extra']):", dict1)
# 同一個鍵出現多次,只會記住最后一次
dict3 = {'name':'Tommy', 'age':25, 'name':'liuzhen153', 'name':'Liuzhen'}
print('dict3:', dict3)
# 鍵是否在dict中存在
print("鍵name是否在dict1中存在'name' in dict1 :" , 'name' in dict1)
# 迭代
print('迭代輸出dict1每一項:')
for key in dict1:
print(key, dict1[key])
```
**輸出結果**
```
dict1: {'name': 'Tommy', 'age': 25, 'sex': 'male', 'extra': 'unmarried'}
dict2: {38.5: 'Today is hot', ('x', 'y'): (1, 2)}
dict1里的name dict1['name']: Tommy
dict2里的('x','y') dict2[('x','y')]: (1, 2)
修改dict1里的age為26 dict1['age'] = 26: {'name': 'Tommy', 'age': 26, 'sex': 'male', 'extra': 'unmarried'}
刪除dict1里的extra del(dict1['extra']): {'name': 'Tommy', 'age': 26, 'sex': 'male'}
dict3: {'name': 'Liuzhen', 'age': 25}
鍵name是否在dict1中存在'name' in dict1 : True
迭代輸出dict1每一項:
name Tommy
age 26
sex male
```
## 基礎函數
```Python
dict = {'name':'Tommy', 'age':25, 'sex':'male', 'extra':'unmarried'}
print("計算dict長度,即鍵的總數 len(dict):", len(dict))
```
**輸出結果**
```
計算dict長度,即鍵的總數 len(dict): 4
```
## 基礎方法
```Python
dict = {'name':'Tommy', 'age':25, 'sex':'male', 'extra':'unmarried'}
dict1 = {'age':27, 'company':'Baidu'}
print("返回所有鍵 dict.keys():", dict.keys())
print("判斷dict中是否存在某個鍵 dict.__contains__('tall'):", dict.__contains__('tall'))
print("返回指定鍵的值,如果值不在字典中返回default值 dict.get(key, default=None):", dict.get('lover','Chaochao'))
print("dict.get()不會修改dict:", dict)
print("返回指定鍵的值,如果值不在字典中返回default值并新增該鍵值對 dict.setdefault(key, default=None):", dict.setdefault('lover','Chaochao'))
print("dict.setdefault()會修改dict:", dict)
print('dict.items()返回可供遍歷的鍵值對:')
for k,v in dict.items():
print(k, v)
dict.update(dict1)
print('dict.update(dict1)會將dict1中的鍵/值更新到dict里,相同鍵會更新值,不存在的會新增:', dict)
print('返回字典中所有的值 dcit.values():', dict.values())
p = dict.pop('tall', 'not exits this key')
print("dict.pop(key[,default]) 刪除key 所對應的值,返回值為被刪除的值。key值不給出時返回default值 dict.pop('tall', 'not exits this key'):", p)
print('現在的dict:', dict)
p = dict.popitem()
print("隨機刪除并返回被刪除的一組鍵值對,如果字典已為空,會出現異常dict.popitem():", p)
print('隨機刪除鍵值對后的dict:', dict)
dict_copy = dict.copy()
print('我是dict復制來的dict_copy:', dict_copy)
dict_copy.clear()
print('dict_copy清空后 dict_copy.clear():', dict_copy)
# 復制和使用 = 賦值不同,復制產生了新的字典,對dict_copy的任何操作不影響dict
print('dict_copy清空后的dict:', dict)
# 使用 = 賦值時,所有的操作都會影響到dict本身
dict3 = dict
print('我是賦值來的dict3:', dict3)
dict3.clear()
print('dict3清空后 dict3.clear():', dict3)
print('dict3清空后的dict:', dict)
```
**輸出結果**
```
返回所有鍵 dict.keys(): dict_keys(['name', 'age', 'sex', 'extra'])
判斷dict中是否存在某個鍵 dict.__contains__('tall'): False
返回指定鍵的值,如果值不在字典中返回default值 dict.get(key, default=None): Chaochao
dict.get()不會修改dict: {'name': 'Tommy', 'age': 25, 'sex': 'male', 'extra': 'unmarried'}
返回指定鍵的值,如果值不在字典中返回default值并新增該鍵值對 dict.setdefault(key, default=None): Chaochao
dict.setdefault()會修改dict: {'name': 'Tommy', 'age': 25, 'sex': 'male', 'extra': 'unmarried', 'lover': 'Chaochao'}
dict.items()返回可供遍歷的鍵值對:
name Tommy
age 25
sex male
extra unmarried
lover Chaochao
dict.update(dict1)會將dict1中的鍵/值更新到dict里,相同鍵會更新值,不存在的會新增: {'name': 'Tommy', 'age': 27, 'sex': 'male', 'extra': 'unmarried', 'lover': 'Chaochao', 'company': 'Baidu'}
返回字典中所有的值 dcit.values(): dict_values(['Tommy', 27, 'male', 'unmarried', 'Chaochao', 'Baidu'])
dict.pop(key[,default]) 刪除key 所對應的值,返回值為被刪除的值。key值不給出時返回default值 dict.pop('tall', 'not exits this key'): not exits this key
現在的dict: {'name': 'Tommy', 'age': 27, 'sex': 'male', 'extra': 'unmarried', 'lover': 'Chaochao', 'company': 'Baidu'}
隨機刪除并返回被刪除的一組鍵值對,如果字典已為空,會出現異常dict.popitem(): ('company', 'Baidu')
隨機刪除鍵值對后的dict: {'name': 'Tommy', 'age': 27, 'sex': 'male', 'extra': 'unmarried', 'lover': 'Chaochao'}
我是dict復制來的dict_copy: {'name': 'Tommy', 'age': 27, 'sex': 'male', 'extra': 'unmarried', 'lover': 'Chaochao'}
dict_copy清空后 dict_copy.clear(): {}
dict_copy清空后的dict: {'name': 'Tommy', 'age': 27, 'sex': 'male', 'extra': 'unmarried', 'lover': 'Chaochao'}
我是賦值來的dict3: {'name': 'Tommy', 'age': 27, 'sex': 'male', 'extra': 'unmarried', 'lover': 'Chaochao'}
dict3清空后 dict3.clear(): {}
dict3清空后的dict: {}
```
# 代碼庫地址
[https://github.com/liuzhen153/play-algorithm-python](https://github.com/liuzhen153/play-algorithm-python)