草根學Python(四) Dict 和 Set

前言

上一篇文章出現了個明顯的知識點錯誤,不過感謝有個網友的提出,及時進行了修改。也希望各位多多包涵。

目錄

一、字典(Dictionary)

經過之前的學習,我們可以知道 list 和 tuple 可以用來表示有序集合,之前我們那個例子是用 list 來存儲了用戶的昵稱

user=[liangdianshui,twowater,兩點水]n

如果我們需要把用戶的賬號也記錄進去呢?

用 list 可以這樣子解決:

user=[[liangdianshui,111111],[twowater,222222],[兩點水,333333]]n

可是這樣表示也不方便,而且很難根據昵稱找到對應的昵稱,且 list 越長,耗時越長;這時候就可以用 dict (字典)來表示了,Python 內置了 字典(dict),dict 全稱dictionary,相當於 JAVA 中的 map,使用鍵-值(key-value)存儲,具有極快的查找速度。

user={liangdianshui:111111 ,twowater:222222 ,兩點水:333333}n

1、dict (字典)的創建

字典是另一種可變容器模型,且可存儲任意類型對象。

字典的每個鍵值(key=>value)對用冒號(:)分割,每個對之間用逗號(,)分割,整個字典包括在花括弧({})中 ,格式如下所示:

dict = {key1 : value1, key2 : value2 }n

注意:鍵必須是唯一的,但值則不必。值可以取任何數據類型,但鍵必須是不可變的。

創建 dict(字典)實例:

dict1={liangdianshui:111111 ,twowater:222222 ,兩點水:333333}ndict2={abc:1234,1234:abc}n

2、訪問 dict (字典)

#-*-coding:utf-8-*-ndict1={liangdianshui:111111 ,twowater:222222 ,兩點水:333333}nprint(dict1)n

輸出的結果:

{liangdianshui: 111111, twowater: 222222, 兩點水: 333333}n

這裡需要注意的一點是:如果字典中沒有這個鍵,是會報錯的。

3、修改 dict (字典)

向字典添加新內容的方法是增加新的鍵/值對,修改或刪除已有鍵/值對

#-*-coding:utf-8-*-ndict1={liangdianshui:111111 ,twowater:222222 ,兩點水:333333}nprint(dict1)n# 新增一個鍵值對ndict1[jack]=444444nprint(dict1)n# 修改鍵值對ndict1[liangdianshui]=555555nprint(dict1)n

輸出的結果:

{liangdianshui: 111111, twowater: 222222, 兩點水: 333333}n{liangdianshui: 111111, twowater: 222222, 兩點水: 333333, jack: 444444}n{liangdianshui: 555555, twowater: 222222, 兩點水: 333333, jack: 444444}n

4、刪除 dict (字典)

通過 del 可以刪除 dict (字典)中的某個元素,也能刪除 dict (字典)

通過調用 clear() 方法可以清除字典中的所有元素

#-*-coding:utf-8-*-ndict1={liangdianshui:111111 ,twowater:222222 ,兩點水:333333}nprint(dict1)n# 通過 key 值,刪除對應的元素ndel dict1[twowater]nprint(dict1)n# 刪除字典中的所有元素ndict1.clear()nprint(dict1)n# 刪除字典ndel dict1n

輸出的結果:

{liangdianshui: 111111, twowater: 222222, 兩點水: 333333}n{liangdianshui: 111111, 兩點水: 333333}n{}n

5、 dict (字典)使用時注意的事項

(1) dict (字典)是不允許一個鍵創建兩次的,但是在創建 dict (字典)的時候如果出現了一個鍵值賦予了兩次,會以最後一次賦予的值為準

例如:

#-*-coding:utf-8-*-ndict1={liangdianshui:111111 ,twowater:222222 ,兩點水:333333,twowater:444444}nprint(dict1)nprint(dict1[twowater])n

輸出的結果:

{liangdianshui: 111111, twowater: 444444, 兩點水: 333333}n444444n

(2) dict (字典)鍵必須不可變,可是鍵可以用數字,字元串或元組充當,但是就是不能使用列表

例如:

#-*-coding:utf-8-*-ndict1={liangdianshui:111111 ,123:222222 ,(123,tom):333333,twowater:444444}nprint(dict1)n

輸出結果:

{liangdianshui: 111111, 123: 222222, (123, tom): 333333, twowater: 444444}n

(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])nprint(set1)n

輸出結果:

{456, 123, 789}n

傳入的參數 [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])nprint(set1)n

輸出的結果:

{456, 123, 789}n

2、set 添加元素

通過 add(key) 方法可以添加元素到 set 中,可以重複添加,但不會有效果

set1=set([123,456,789])nprint(set1)nset1.add(100)nprint(set1)nset1.add(100)nprint(set1)n

輸出結果:

{456, 123, 789}n{456, 123, 100, 789}n{456, 123, 100, 789}n

3、set 刪除元素

通過 remove(key) 方法可以刪除 set 中的元素

set1=set([123,456,789])nprint(set1)nset1.remove(456)nprint(set1)n

輸出的結果:

{456, 123, 789}n{123, 789}n

4、set 的運用

因為 set 是一個無序不重複元素集,因此,兩個 set 可以做數學意義上的 union(並集), intersection(交集), difference(差集) 等操作。

例子:

set1=set(hello)nset2=set([p,y,y,h,o,n])nprint(set1)nprint(set2)nn# 交集 (求兩個 set 集合中相同的元素)nset3=set1 & set2nprint(n交集 set3:)nprint(set3)n# 並集 (合併兩個 set 集合的元素並去除重複的值)nset4=set1 | set2nprint(n並集 set4:)nprint(set4)n# 差集nset5=set1 - set2nset6=set2 - set1nprint(n差集 set5:)nprint(set5)nprint(n差集 set6:)nprint( set6)nnn# 去除海量列表裡重複元素,用 hash 來解決也行,只不過感覺在性能上不是很高,用 set 解決還是很不錯的nlist1 = [111,222,333,444,111,222,333,444,555,666] nset7=set(list1)nprint(n去除列表裡重複元素 set7:)nprint(set7)n

運行的結果:

{h, l, e, o}n{h, n, o, y, p}nn交集 set3:n{h, o}nn並集 set4:n{h, p, n, e, o, y, l}nn差集 set5:n{l, e}nn差集 set6:n{p, y, n}nn去除列表裡重複元素 set7:n{555, 333, 111, 666, 444, 222}n

推薦閱讀:

TAG:Python | Python入门 | Python教程 |