一、字典(Dictionary)
1、什么是 dict(字典)
上一章節,我們學習了列表(List) 和 元組(tuple) 來表示有序集合。
而我們在講列表(list)的時候,我們用了列表(list) 來存儲用戶的姓名。
name = ['一點水', '兩點水', '三點水', '四點水', '五點水']
那么如果我們為了方便聯系這些童鞋,要把電話號碼也添加進去,該怎么做呢?
用 list 可以這樣子解決:
name = [['一點水', '131456780001'], ['兩點水', '131456780002'], ['三點水', '131456780003'], ['四點水', '131456780004'], ['五點水', '131456780005']]
但是這樣很不方便,我們把電話號碼記錄下來,就是為了有什么事能及時聯系上這些童鞋。
如果用列表來存儲這些,列表越長,我們查找起來耗時就越長。
這時候就可以用 dict (字典)來表示了,Python 內置了 字典(dict),dict 全稱 dictionary,如果學過 Java ,字典就相當於 JAVA 中的 map,使用鍵-值(key-value)存儲,具有極快的查找速度。
name = {'一點水': '131456780001', '兩點水': '131456780002', '三點水': '131456780003', '四點水': '131456780004', '五點水': '131456780005'}
2、dict (字典)的創建
字典是另一種可變容器模型,且可存儲任意類型對象。
字典的每個鍵值(key=>value)對用冒號(:)分割,每個對之間用逗號(,)分割,整個字典包括在花括號({})中 ,格式如下所示:
dict = {key1 : value1, key2 : value2 }
注意:鍵必須是唯一的,但值則不必。值可以取任何數據類型,但鍵必須是不可變的。
創建 dict(字典)實例:
dict1={'liangdianshui':'111111' ,'twowater':'222222' ,'兩點水':'333333'} dict2={'abc':1234,1234:'abc'}
3、訪問 dict (字典)
我們知道了怎么創建列表了,回歸到一開始提出到的問題,為什么使用字典能讓我們很快的找出某個童鞋的電話呢?
name = {'一點水': '131456780001', '兩點水': '131456780002', '三點水': '131456780003', '四點水': '131456780004', '五點水': '131456780005'} print(name['兩點水'])
輸出的結果:
131456780002
可以看到,如果你知道某個人的名字,也就是 key 值, 就能很快的查找到他對應的電話號碼,也就是 Value 。
這里需要注意的一點是:如果字典中沒有這個鍵,是會報錯的。
4、修改 dict (字典)
向字典添加新內容的方法是增加新的鍵/值對,修改或刪除已有鍵/值對
#-*-coding:utf-8-*-
dict1={'liangdianshui':'111111' ,'twowater':'222222' ,'兩點水':'333333'} print(dict1) # 新增一個鍵值對 dict1['jack']='444444' print(dict1) # 修改鍵值對 dict1['liangdianshui']='555555' print(dict1)
輸出的結果:
{'liangdianshui': '111111', 'twowater': '222222', '兩點水': '333333'}
{'liangdianshui': '111111', 'twowater': '222222', '兩點水': '333333', 'jack': '444444'}
{'liangdianshui': '555555', 'twowater': '222222', '兩點水': '333333', 'jack': '444444'}
5、刪除 dict (字典)
通過 del
可以刪除 dict (字典)中的某個元素,也能刪除 dict (字典)
通過調用 clear()
方法可以清除字典中的所有元素
#-*-coding:utf-8-*-
dict1={'liangdianshui':'111111' ,'twowater':'222222' ,'兩點水':'333333'} print(dict1) # 通過 key 值,刪除對應的元素 del dict1['twowater'] print(dict1) # 刪除字典中的所有元素 dict1.clear() print(dict1) # 刪除字典 del dict1
輸出的結果:
{'liangdianshui': '111111', 'twowater': '222222', '兩點水': '333333'}
{'liangdianshui': '111111', '兩點水': '333333'}
{}
6、 dict (字典)使用時注意的事項
(1) dict (字典)是不允許一個鍵創建兩次的,但是在創建 dict (字典)的時候如果出現了一個鍵值賦予了兩次,會以最后一次賦予的值為准
例如:
#-*-coding:utf-8-*-
dict1={'liangdianshui':'111111' ,'twowater':'222222' ,'兩點水':'333333','twowater':'444444'} print(dict1) print(dict1['twowater'])
輸出的結果:
{'liangdianshui': '111111', 'twowater': '444444', '兩點水': '333333'}
444444
(2) dict (字典)鍵必須不可變,可是鍵可以用數字,字符串或元組充當,但是就是不能使用列表
例如:
#-*-coding:utf-8-*-
dict1={'liangdianshui':'111111' ,123:'222222' ,(123,'tom'):'333333','twowater':'444444'} print(dict1)
輸出結果:
{'liangdianshui': '111111', 123: '222222', (123, 'tom'): '333333', 'twowater': '444444'}
(3) dict 內部存放的順序和 key 放入的順序是沒有任何關系
和 list 比較,dict 有以下幾個特點:
-
查找和插入的速度極快,不會隨着key的增加而變慢
-
需要占用大量的內存,內存浪費多
而list相反:
-
查找和插入的時間隨着元素的增加而增加
-
占用空間小,浪費內存很少
7、dict (字典) 的函數和方法
方法和函數 | 描述 |
---|---|
len(dict) | 計算字典元素個數 |
str(dict) | 輸出字典可打印的字符串表示 |
type(variable) | 返回輸入的變量類型,如果變量是字典就返回字典類型 |
dict.clear() | 刪除字典內所有元素 |
dict.copy() | 返回一個字典的淺復制 |
dict.values() | 以列表返回字典中的所有值 |
popitem() | 隨機返回並刪除字典中的一對鍵和值 |
dict.items() | 以列表返回可遍歷的(鍵, 值) 元組數組
|
二、set
python 的 set 和其他語言類似, 是一個無序不重復元素集, 基本功能包括關系測試和消除重復元素。
set 和 dict 類似,但是 set 不存儲 value 值的。
1、set 的創建
創建一個 set,需要提供一個 list 作為輸入集合
set1=set([123,456,789]) print(set1)
輸出結果:
{456, 123, 789}
傳入的參數 [123,456,789]
是一個 list,而顯示的 {456, 123, 789}
只是告訴你這個 set 內部有 456, 123, 789 這 3 個元素,顯示的順序跟你參數中的 list 里的元素的順序是不一致的,這也說明了 set 是無序的。
還有一點,我們觀察到輸出的結果是在大括號中的,經過之前的學習,可以知道,tuple (元組) 使用小括號,list (列表) 使用方括號, dict (字典) 使用的是大括號,dict 也是無序的,只不過 dict 保存的是 key-value 鍵值對值,而 set 可以理解為只保存 key 值。
回憶一下,在 dict (字典) 中創建時,有重復的 key ,會被后面的 key-value 值覆蓋的,而 重復元素在 set 中自動被過濾的。
set1=set([123,456,789,123,123]) print(set1)
輸出的結果:
{456, 123, 789}
2、set 添加元素
通過 add(key) 方法可以添加元素到 set 中,可以重復添加,但不會有效果
set1=set([123,456,789]) print(set1) set1.add(100) print(set1) set1.add(100) print(set1)
輸出結果:
{456, 123, 789}
{456, 123, 100, 789}
{456, 123, 100, 789}
3、set 刪除元素
通過 remove(key) 方法可以刪除 set 中的元素
set1=set([123,456,789]) print(set1) set1.remove(456) print(set1)
輸出的結果:
{456, 123, 789}
{123, 789}
4、set 的運用
因為 set 是一個無序不重復元素集,因此,兩個 set 可以做數學意義上的 union(並集), intersection(交集), difference(差集) 等操作。
例子:
set1=set('hello') set2=set(['p','y','y','h','o','n']) print(set1) print(set2) # 交集 (求兩個 set 集合中相同的元素) set3=set1 & set2 print('\n交集 set3:') print(set3) # 並集 (合並兩個 set 集合的元素並去除重復的值) set4=set1 | set2 print('\n並集 set4:') print(set4) # 差集 set5=set1 - set2 set6=set2 - set1 print('\n差集 set5:') print(set5) print('\n差集 set6:') print( set6) # 去除海量列表里重復元素,用 hash 來解決也行,只不過感覺在性能上不是很高,用 set 解決還是很不錯的 list1 = [111,222,333,444,111,222,333,444,555,666] set7=set(list1) print('\n去除列表里重復元素 set7:') print(set7)
運行的結果:
{'h', 'l', 'e', 'o'}
{'h', 'n', 'o', 'y', 'p'}
交集 set3:
{'h', 'o'}
並集 set4:
{'h', 'p', 'n', 'e', 'o', 'y', 'l'}
差集 set5:
{'l', 'e'}
差集 set6:
{'p', 'y', 'n'}
去除列表里重復元素 set7:
{555, 333, 111, 666, 444, 222}