簡介:
集合是無序的,不重復的數據集合,它里面的元素是可哈希的(不可變類型),但是集合本身是不可哈希(所以集合做不了字典的鍵)的。以下是集合最重要的兩點:
1、去重,把一個列表變成集合,就自動去重了。
2、關系測試,測試兩組數據之前的交集、差集、並集等關系。
一、集合的創建
1 set1 = set({1,2,3,4,5}) 2 set2 = {1,2,3,4,5} 3 set3 = set('abc') 4 print(set1,set2,set3) #{1, 2, 3, 4, 5} {1, 2, 3, 4, 5} {'c', 'b', 'a'}
二、添加集合元素的方法
▷add( )方法:
此方法是用來往集合里添加單個元素,如果已存在,則不會添加。
1 set1 = {1,2,3,4,5} 2 set1.add(6) 3 print(set1) 4 set1.add(1) 5 print(set1)
▷update( )方法:
此方法是用來迭代的往集合里添加元素
1 set1 = {1,2,3,4,5} 2 set1.update('6') #不能直接添加數字類型,因為數字類型不可迭代 3 print(set1) # {1, 2, 3, 4, 5, '6'} 4 5 set1.update('abc') 6 print(set1) #{1, 2, 3, 4, 5, 'c', 'a', '6', 'b'} 7 8 set1.update([1,7,8,9]) 9 print(set1) #{1, 2, 3, 4, 5, 'b', 7, 8, 9, 'a', 'c', '6'}
三、刪除集合元素的方法
1 set1 = {1,2,3,4,5} 2 set1.pop() #隨機刪除一個元素,將元素值返回 3 4 set1.remove('2') #指定刪除一個元素,找不到就會報錯 5 6 set1.clear() #清空整個集合 7 8 del set1 #刪除整個集合
四、查詢集合元素的方法
由於集合是無序的又沒有索引,所以查詢集合元素只有一種,那就是循環,如下:
1 set1 = {1,2,3,4,5} 2 for s in set1: 3 print(s) 4 #結果如下: 5 # 1 6 # 2 7 # 3 8 # 4 9 # 5
五、集合的交集、並集等
1 set1 = {1,2,3,7,8} 2 set2 = {2,3,6,9} 3 4 print(set1&set2) #交集{2, 3} 5 print(set1|set2) #並集{1, 2, 3, 6, 7, 8, 9} 6 print(set1^set2) #反交集{1, 6, 7, 8, 9} 7 print(set1-set2) #差集{8, 1, 7} 獨有的 8 print(set2-set1) #差集{9, 6} 獨有的 9 10 11 set1 = {1,2,3} #set1為set2的子集 12 set2 = {1,2,3,4,5} #set2為set1的超集
13 print(set1 < set2) #判斷一個集合是否為另一個集合的子集,用' < '判斷 如果是,返回:True
六、frozenset( )不可變集合(無法添加無法修改)
1 set1 = {1,2,3,4,5} 2 set2 = frozenset(set1) 3 print(set2,type(set2)) 4 #結果為:frozenset({1, 2, 3, 4, 5}) <class 'frozenset'> 5 6 #創建方法如下: 7 set3 = frozenset({1,2,3}) 8 print(set3) # frozenset({1, 2, 3}) 9 10 set4 = frozenset('abc') #迭代添加 11 print(set4) # frozenset({'a', 'b', 'c'})
七、copy( )與 deepcopy()
這兩種方法用於復制一個變量然后賦值給另一個變量。
copy( )----淺復制
簡單來講,用此方法復制后的變量與原變量對應的內存地址是不一樣的,修改它第一層的元素,另一個變量不會被修改
但是如果他們有嵌套(如列表里嵌套列表),那么第二層嵌套的列表與另一個變量所對應的列表的地址就是一個內存地址了,
這個時候,如果修改第二層的元素,則另一個變量也會被修改
▷用法:
1 a = ['a','b','c'] 2 b = a.copy() 3 print(b) 4 #結果為:['a', 'b', 'c']
▷復制之后兩個變量所對應的內存地址的問題:
先看賦值運算:
此時兩個內存地址是一樣的,更改一個列表的值,另一個也會被修改:如下:
li1 = [1,2,[3,4],5]
li2 = li1
print(li1 is li2) # True
li2[0] = 0 #更改li2的值,li1也會被修改
print(li1) #結果:[0, 2, [3, 4], 5]
再看看copy方法:
此時他們的內存地是不同的,更改一個列表的第一層元素的值,另一個不會被更改,如下:
li1 = [1,2,[3,4],5] li2 = li1.copy() print(li1 is li2) #False li2[0] = 0 #更改li2第一層的值,li1不會被修改 print(li1) #[1, 2, [3, 4], 5]
但是,如果我們要修改一個列表的第二層元素的話,另一個列表就會被修改了,如下:
1 li1 = [1,2,[3,4],5] 2 li2 = li1.copy() 3 print(li1 is li2) #False 4 5 li2[2][0] = 0 #更改li2第二層的值,li1就會被修改 6 print(li1) #[1, 2, [0, 4], 5]
deepcopy( )----深復制
簡單來講,用此方法復制后的變量與原變量對應的內存地址是不一樣的,不管有沒有嵌套,修改它第一層的元素,另一個變量不會被修改
但是用這個方法之前,必須得導入copy包,如下:
1 import copy 2 li1 = [1,2,[3,4],5] 3 li2 = copy.deepcopy(li1) 4 print(li1 is li2) #False 5 6 li2[2][0] = 0 #更改li2第二層的值,li1也不會被修改 7 print(li1) #[1, 2, [3, 4], 5]
八、如何將一個列表里的重復元素去掉
▷思路:將列表轉換為集合,它會自動去重,然后再將集合轉換為列表即可
▷代碼:如下:
1 li1 = [1,2,3,2,1,5,6,7,6,5,8] 2 set1 = set(li1) 3 li1 = list(set1) 4 print(li1) #結果為:[1, 2, 3, 5, 6, 7, 8]