# 0.相關確定 本教程使用的版本號為專業版PyCharm 2022.3.2,如果您是初學者,為了更好的學習本教程,避免不必要的麻煩,請您下載使用與本教程一致的版本號。 # 1.PyCharm的下載 官網下載:https://www.jetbrains.com/pycharm/download/ot ...
集合是無序的,不重覆的數據集合,它裡面的元素是可哈希的(不可變類型),但是集合本身是不可哈希(所以集合做不了字典的鍵)的。
以下是集合最重要的兩點:
1、去重,把一個列表變成集合,就自動去重了。
2、關係測試,測試兩組數據之前的交集、差集、並集等關係。
一、集合的創建
set1 = set({1,2,3,4,5})
set2 = {1,2,3,4,5}
set3 = set('abc')
print(set1,set2,set3) #{1, 2, 3, 4, 5} {1, 2, 3, 4, 5} {'c', 'b', 'a'}
二、添加集合元素的方法
add( )方法:
此方法是用來往集合里添加單個元素,如果已存在,則不會添加。
set1 = {1,2,3,4,5}
set1.add(6)
print(set1)
set1.add(1)
print(set1)
update( )方法:
此方法是用來迭代的往集合里添加元素
set1 = {1,2,3,4,5}
set1.update('6') #不能直接添加數字類型,因為數字類型不可迭代
print(set1) # {1, 2, 3, 4, 5, '6'}
set1.update('abc')
print(set1) #{1, 2, 3, 4, 5, 'c', 'a', '6', 'b'}
set1.update([1,7,8,9])
print(set1) #{1, 2, 3, 4, 5, 'b', 7, 8, 9, 'a', 'c', '6'}
三、刪除集合元素的方法
set1 = {1,2,3,4,5}
set1.pop() #隨機刪除一個元素,將元素值返回
set1.remove('2') #指定刪除一個元素,找不到就會報錯
set1.clear() #清空整個集合
del set1 #刪除整個集合
四、查詢集合元素的方法
由於集合是無序的又沒有索引,所以查詢集合元素只有一種,那就是迴圈,如下:
set1 = {1,2,3,4,5}
for s in set1:
print(s)
#結果如下:
# 1
# 2
# 3
# 4
# 5
五、集合的交集、並集等
set1 = {1,2,3,7,8}
set2 = {2,3,6,9}
print(set1&set2) #交集{2, 3}
print(set1|set2) #並集{1, 2, 3, 6, 7, 8, 9}
print(set1^set2) #反交集{1, 6, 7, 8, 9}
print(set1-set2) #差集{8, 1, 7} 獨有的
print(set2-set1) #差集{9, 6} 獨有的
set1 = {1,2,3} #set1為set2的子集
set2 = {1,2,3,4,5} #set2為set1的超集13 print(set1 < set2) #判斷一個集合是否為另一個集合的子集,用' < '判斷 如果是,返回:True
六、frozenset( )不可變集合(無法添加無法修改)
set1 = {1,2,3,4,5}
set2 = frozenset(set1)
print(set2,type(set2))
#結果為:frozenset({1, 2, 3, 4, 5}) <class 'frozenset'>
#創建方法如下:
set3 = frozenset({1,2,3})
print(set3) # frozenset({1, 2, 3})
set4 = frozenset('abc') #迭代添加
print(set4) # frozenset({'a', 'b', 'c'})
七、copy( )與 deepcopy()
這兩種方法用於複製一個變數然後賦值給另一個變數。
copy( )----淺複製
簡單來講,用此方法複製後的變數與原變數對應的記憶體地址是不一樣的,修改它第一層的元素,另一個變數不會被修改
但是如果他們有嵌套(如列表裡嵌套列表),那麼第二層嵌套的列表與另一個變數所對應的列表的地址就是一個記憶體地址了,
這個時候,如果修改第二層的元素,則另一個變數也會被修改
用法:
a = ['a','b','c']
b = a.copy()
print(b)
#結果為:['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]
但是,如果我們要修改一個列表的第二層元素的話,另一個列表就會被修改了,如下:
li1 = [1,2,[3,4],5]
li2 = li1.copy()
print(li1 is li2) #False
li2[2][0] = 0 #更改li2第二層的值,li1就會被修改
print(li1) #[1, 2, [0, 4], 5]
deepcopy( )----深複製
簡單來講,用此方法複製後的變數與原變數對應的記憶體地址是不一樣的,不管有沒有嵌套,修改它第一層的元素,另一個變數不會被修改
但是用這個方法之前,必須得導入copy包,如下:
import copy
li1 = [1,2,[3,4],5]
li2 = copy.deepcopy(li1)
print(li1 is li2) #False
#Python小白學習交流群:711312441
li2[2][0] = 0 #更改li2第二層的值,li1也不會被修改
print(li1) #[1, 2, [3, 4], 5]
八、如何將一個列表裡的重覆元素去掉
思路:將列表轉換為集合,它會自動去重,然後再將集合轉換為列表即可
代碼:
li1 = [1,2,3,2,1,5,6,7,6,5,8]
set1 = set(li1)
li1 = list(set1)
print(li1) #結果為:[1, 2, 3, 5, 6, 7, 8]