前言
上一篇文章出現了個明顯的知識點錯誤,不過感謝有個網友的提出,及時進行了修改。也希望各位多多包涵。
目錄
一、字典(Dictionary)
經過之前的學習,我們可以知道 list 和 tuple 可以用來表示有序集合,之前我們那個例子是用 list 來儲存了使用者的暱稱
user=[`liangdianshui`,`twowater`,`兩點水`]複製程式碼
如果我們需要把使用者的賬號也記錄進去呢?
用 list 可以這樣子解決:
user=[[`liangdianshui`,`111111`],[`twowater`,`222222`],[`兩點水`,`333333`]]複製程式碼
可是這樣表示也不方便,而且很難根據暱稱找到對應的暱稱,且 list 越長,耗時越長;這時候就可以用 dict (字典)來表示了,Python 內建了 字典(dict),dict 全稱dictionary,相當於 JAVA 中的 map,使用鍵-值(key-value)儲存,具有極快的查詢速度。
user={`liangdianshui`:`111111` ,`twowater`:`222222` ,`兩點水`:`333333`}複製程式碼
1、dict (字典)的建立
字典是另一種可變容器模型,且可儲存任意型別物件。
字典的每個鍵值(key=>value)對用冒號(:)分割,每個對之間用逗號(,)分割,整個字典包括在花括號({})中 ,格式如下所示:
dict = {key1 : value1, key2 : value2 }複製程式碼
注意:鍵必須是唯一的,但值則不必。值可以取任何資料型別,但鍵必須是不可變的。
建立 dict(字典)例項:
dict1={`liangdianshui`:`111111` ,`twowater`:`222222` ,`兩點水`:`333333`}
dict2={`abc`:1234,1234:`abc`}複製程式碼
2、訪問 dict (字典)
#-*-coding:utf-8-*-
dict1={`liangdianshui`:`111111` ,`twowater`:`222222` ,`兩點水`:`333333`}
print(dict1)複製程式碼
輸出的結果:
{`liangdianshui`: `111111`, `twowater`: `222222`, `兩點水`: `333333`}複製程式碼
這裡需要注意的一點是:如果字典中沒有這個鍵,是會報錯的。
3、修改 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`}複製程式碼
4、刪除 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`}
{}複製程式碼
5、 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相反:
-
查詢和插入的時間隨著元素的增加而增加
-
佔用空間小,浪費記憶體很少
6、dict (字典) 的函式和方法
方法和函式 | 描述 |
---|---|
cmp(dict1, dict2) | 比較兩個字典元素 |
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(`
交集 set3:`)
print(set3)
# 並集 (合併兩個 set 集合的元素並去除重複的值)
set4=set1 | set2
print(`
並集 set4:`)
print(set4)
# 差集
set5=set1 - set2
set6=set2 - set1
print(`
差集 set5:`)
print(set5)
print(`
差集 set6:`)
print( set6)
# 去除海量列表裡重複元素,用 hash 來解決也行,只不過感覺在效能上不是很高,用 set 解決還是很不錯的
list1 = [111,222,333,444,111,222,333,444,555,666]
set7=set(list1)
print(`
去除列表裡重複元素 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}複製程式碼