1. 程式人生 > >2.4.1 集合基礎知識

2.4.1 集合基礎知識

這一 也不能 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 集合基礎知識