集合是無序的,不重復的資料集合,它里面的元素是可哈希的(不可變型別),但是集合本身是不可哈希(所以集合做不了字典的鍵)的,
以下是集合最重要的兩點:
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]
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/553411.html
標籤:其他
下一篇:返回列表
