(1)集合是無序的,不重複的數據集合,它裏面的元素的類型是可哈希的(即:不可變類型),可是集合自己是可變類型,可以進行增刪查操做。python
(2)空集合的表示方法:set()面試
(3)集合的做用:app
1. 數據去重,把一個列表變成集合,就自動去重。測試
2. 關係測試,測試兩組數據的並集,交集,差集等...spa
# 建立元組對象
set1 = {1,2,3,4}
print(set1)
>>> {1, 2, 3, 4}
# 集合的元素都是不可變類型,因此只能包含數值,字符串,元組。
set2 = {1,2,3,['python']}
print(set2)
>>>>>>TypeError: unhashable type: 'list'
#經過set()方法建立集合
set3 = set({1,2,3,'barry'})
print(set3)
# 集合的操做blog
(1)增內存
#謹記:集合是無序的 '''add()''' set1 = {'alex','wusir','evj','taibai'} set1.add('he') print(set1) >>>{'he', 'alex', 'evj', 'wusir', 'taibai'} '''update():把可迭代對象的元素分別增長''' set1 = {'alex','wusir','evj','taibai'} set1.update('A') print(set1) >>>{'alex', 'taibai', 'A', 'evj', 'wusir'} set1.update('老師') print(set1) >>> {'taibai', '老', 'wusir', 'evj', '師', 'alex'} set1.update([1,2,3]) print(set1) >>> {1, 'wusir', 2, 3, 'evj', 'alex', 'taibai'}
(2)刪element
'''remove(element):刪除一個元素,若是不存在,則報錯''' set1 = {'alex','wusir','evj','taibai'} set1.remove('alex') set1.remove('he') #元素不存在,則會報錯 >>>KeyError: 'he' print(set1) '''pop():隨機刪除一個元素,並返回此元素''' set1 = {'alex','wusir','evj','taibai'} res=set1.pop() print(res) print(set1) '''clear():清空集合,保留集合自己''' set1 = {'alex','wusir','evj','taibai'} set1.clear() print(set1) >>> set() #謹記:空集合的寫法爲:set() '''del語句 在內存級別刪除集合自己''' set1 = {'alex','wusir','evj','taibai'} del set1 print(set1)
(3)集合的關係測試rem
#並集(| 或 union) set1 = {1,2,3} set2 = {4,5} set3 = set1 | set2 print(set3) set3 = set1.union(set2) print(set3) # 交集(& 或 intersection) set1 = {1,2,3} set2 = {3,4} set3 = set1 & set2 print(set3) # 反交集(^ 或 symmetric_difference) set1 = {1,2,3} set2 = {3,4} set3 = set1.symmetric_difference(set2) print(set3) # 差集(- 或者 difference) set1 = {1,2,3,4,5} set2 = {1,2,3} set3 = set1 - set2 print(set3) set3 = set1.difference(set2) print(set3) #子集 <, issubset() set1 = {1,2,3,4,5} set2 = {1,2,3} print(set2 < set1) print(set2.issubset(set1)) #超集 >,issuperset()
事前須知:賦值的含義
l1 = [1,2,3] l2 = l1 l1.append(666) print(l2) print(id(l1)) print(id(l2)) >>> [1, 2, 3, 666] 2153377571720 2153377571720 #證實l1,l2在內存中指向的是同一個地址。因此l1改變,L2也會變。
(1)淺copy
l1 = [1,2,3]
l2 = l1.copy() l1.append(666) print(l1) print(l2) >>> [1, 2, 3, 666] [1, 2, 3] ****從上面的代碼看,好像沒有太大問題,接着往下看,神奇的事情發生了****
l1 = [1,2,3,[22]] l2 = l1.copy() l1[-1].append(666) print(l1) >>>[1, 2, 3, [22, 666]] print(l2) >>>[1, 2, 3, [22, 666]] print(id(l1)) print(id(l2)) print(id(l1[0])) print(id(l2[0])) print(id(l1[-1])) print(id(l2[-1])) >>> 2233198322568 2233199144648 1964990688 1964990688 2233198322696 2233198322696
總結:
淺copy只是在第一層的內存地址是不一樣的,從第二層開始以及更深層,都是共用的一個內存地址。
(2)深copy
# 深copy須要用到copy模塊中的deepcopy()方法 import copy l1 = [1,2,3,[22]] l2 = copy.deepcopy(l1) l1.append(666) print(l1) print(l2) >>> [1, 2, 3, [22], 666] [1, 2, 3, [22]] import copy l1 = [1,2,3,[22]] l2 = copy.deepcopy(l1) l1[-1].append(666) print(l1) print(l2) >>> [1, 2, 3, [22, 666]] [1, 2, 3, [22]]
print(id(l1))
print(id(l2))
print(id(l1[-1]))
print(id(l2[-1]))
>>>
1590872594312
1590872595592
1590872594120
1590872595528
總結:
深copy的兩個對象之間是徹底獨立的關係,兩個對象的內存地址徹底不同。
(3)應用場景:
1.徹底獨立的copy一份數據,與原數據沒有關係,就使用深copy。
2.若是有一份數據的第二層想與原數據進行共有,就使用淺copy。
(4)面試題:
一.解釋深淺copy的含義。
二.徹底切片[:]屬於淺copy
l1 = [1,2,3,[22,33]] l2 = l1[:] # l1.append(66) # print(l1) # print(l2) l1[-1].append(66) print(l1)>>> [1,2,3,[22,33,66]] print(l2)>>> [1,2,3,[22,33,66]]