2.4.1 集合基礎知識
阿新 • • 發佈:2018-03-12
這一 也不能 time sed OS pan 逗號 運算 提示
集合是無序可變序列,使用一對大括號(作者溫馨提示:這一點和字典很類似,千萬不要搞混啊)作為界定符,元素之間使用逗號分隔,同一個集合內的每個元素都是唯一的,元素之間不允許重復。
在Python中,直接將集合賦值給變量即可創建一個集合對象。
1 >>> a = {3,5} #創建集合對象 2 >>> a 3 {3, 5} 4 >>> 5 >>> type(a) #查看對象類型 6 <class ‘set‘> 7 >>>
也可以使用set()函數將列表、元組等其他可叠代對象轉換為集合,如果原來的數據中存在重復元素,則在轉換為集合的時候只保留一個元素。
1 >>> aset = set(range(8,14)) #創建集合對象 2 >>> aset 3 {8, 9, 10, 11, 12, 13} 4 >>> 5 >>> bset = set([0,1,2,3,0,1,2,3,7,8]) #轉換時自動去掉重復元素 6 >>> bset 7 {0, 1, 2, 3, 7, 8} 8 >>> 9 >>> x = set() #創建一個空集合10 >>> x 11 set() 12 >>>
當不再使用某個集合時,可以使用del命令刪除整個集合。
註意:集合中是能包含數字、字符串、元組等不可變類型(或者說可哈希)的數據,而不能包含列表、字典、集合等可變類型的數據。Python提供了一個內置函數hash()來計算對象的哈希值,凡是無法計算哈希值(調用hash()函數時拋出異常)的對象都不能作為集合的元素,也不能作為字典對象的“鍵”。
拓展知識:字典和集合的in操作比列表快很多。相信各位讀者也能有這樣的體驗,一個功能可以使用很多種方法實現,也可以采用不同的數據類型實現。如果仔細分析比較一下會發現,不同數據類型質監某些操作的效率相差還是很大的,在選用是應多加註意,因為不同的選擇意味著不同的速度和效率。例如,由於Python字典和集合都適用hash表來存儲元素,因此元素查找操作的速度非常快,這就直接決定了關鍵字in作用於字典和集合時比列表快的多。
1 import random 2 import time 3 4 x = list(range(10000)) #生成列表 5 y = set(range(10000)) #生成集合 6 z = dict(zip(range(10000),range(10000))) #生成字典 7 8 r = random.randint(0,999) #生成隨機數 9 10 start = time.time() 11 for i in range(9999999): 12 r in x #測試列表中是否包含某個元素 13 print(‘list,time used:{}‘.format(time.time() - start)) 14 15 start = time.time() 16 for i in range(9999999): 17 r in y #測試列表中是否包含某個元素 18 print(‘set,time used:{}‘.format(time.time() - start)) 19 20 start = time.time() 21 for i in range(9999999): 22 r in z #測試列表中是否包含某個元素 23 print(‘dict,time used:{}‘.format(time.time() - start))
上面代碼運行結果如下,對於成員測試運算符in,列表的效率遠遠不如字典和集合,差距簡直太驚人了。大家修改一下上面代碼中列表、字典和集合的長度就會發現,隨著序列的變長,列表的速度越來越慢,而字典和集合基本上不受影響。
1 list,time used:162.63028526306152 2 set, time used:1.421081304550171 3 dict,time used:1.3880794048309326
2.4.1 集合基礎知識