python之集合知識點總結
集合的定義
集合(dict)是一組0至多個無序的、無重複的不可變物件。集合的底層結構也是散列表(hash table),可以快速查詢集合內的元素,是一種以空間換時間的資料結構。
set1 = {'今日', '頭條', '關於', '集合','案例'}
for i in set1:
print(i)
# 多次執行上述程式碼驗證,可以發現每次列印的順序都不一樣,說明是無序的。
集合的建立
-
空集合,set()。
set1 = set() print(type(set1)) out: <class 'set'>
-
1個元素的集合,花括號將其包圍。
set1 = {'今日'} print(type(set1)) out: <class 'set'>
-
多個元素的集合,用花括號將所有元素包圍,元素之間用逗號隔開。
set1 = {'今日', '頭條', '關於', '集合','案例'} for i in set1: print(i) out: 關於 案例 今日 集合 頭條
-
其他型別轉換成集合。
tupl1 = ('name', 'age', 'money', 'height') list1 = ["Mike", 20, 8000, 180] dict1 = {'name': 'Mike', 'age': 20, 'money': 8000, 'height': 180} set1 = set(tupl1) set2 = set(list1) set3 = set(dict1) print(set1, type(set1)) print(set2, type(set2)) print(set3, type(set3)) out: {'money', 'height', 'name', 'age'} <class 'set'> {8000, 180, 'Mike', 20} <class 'set'> {'money', 'height', 'name', 'age'} <class 'set'>
-
推導式,建立方法和列表推導式如出一轍。
set1 = {i for i in range(10)} print(set1, type(set1)) out: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} <class 'set'>
集合的訪問
-
集合比較特殊,沒有直接訪問元素的方法。但可以對集合for迴圈遍歷元素。
set1 = {'頭條', 5, 4, 3, '集合', 2, 1, '測試'} for i in set1: print(i) out: 頭條 2 3 4 5 1 測試 集合
集合的增加
-
通過add方法新增元素。add的引數只可接收不可變物件(數字、字串、元組),不可接收可變物件(列表、字典、集合)。
set1 = {'頭條', 3, '集合', 2, 1, '測試'} set1.add(('abc','bcd')) print(set1) out: {1, 2, 3, '頭條', '集合', '測試', ('abc', 'bcd')}
-
通過update方法新增。update的引數可以是不可變物件,也可以是可變物件(如果嵌套了可變物件會報錯)。
set1 = {'頭條', 3, '集合', 2, 1, '測試'} set2 = [[i, j] for i in range(5, 8) for j in range(8, 10)] # set1.update(set2) 報錯,因為set2內部元素是列表,不能轉成不可變物件 set3 = [i for i in range(5, 8)] set1.update(set3) # 成功,因為set3內部元素是數字,可轉成不可變物件 print(set1) out: {1, 2, 3, '測試', 5, 6, 7, '頭條', '集合'}
集合的刪除
-
del:可直接刪除集合本身,但不能指定刪除集合的元素。
set1 = {'頭條', 3, '集合', 2, 1, '測試'} del set1
-
pop方法:無引數方法,隨機刪除一個元素並返回。
set1 = {'頭條', 3, '集合', 2, 1, '測試'} print(set1.pop()) out: 集合
-
remove方法:移除指定元素,若該元素不存在會報錯,無返回值。
set1 = {'頭條', 3, '集合', 2, 1, '測試'} set1.remove('頭條') print(set1) # set1.remove(5) 5b不是set1的元素,移除時會報KeyError out: {1, 2, 3, '集合', '測試'}
-
discard方法:溢位指定元素,若該元素不存在不報錯,無返回值。
set1 = {'頭條', 3, '集合', 2, 1, '測試'} set1.discard(5) set1.discard(1) print(set1) out: {2, 3, '集合', '頭條', '測試'}
-
clear方法:清空集合內容,保留集合本身,在迴圈體中需要清空集合時優先用這個方法,而不要新建集合,因為新建的開銷相對較大。
set1 = {'頭條', 3, '集合', 2, 1, '測試'} set1.clear() print(set1) out: {}
集合的運算
-
並集:集合A和集合B所有元素。
set_a = {0, 1, 2, 3, 4} set_b = {3, 4, 5, 6, 7} set_c = set_a.union(set_b) print(set_c) out: {0, 1, 2, 3, 4, 5, 6, 7}
-
交集:集合A和集合B共有的元素。
set_a = {0, 1, 2, 3, 4} set_b = {3, 4, 5, 6, 7} set_c = set_a.intersection(set_b) # 返回集合a和b的交集 set_a.intersection_update() # 直接把集合a中不是交集的元素去掉 print(set_c) print(set_a) out: {3, 4} {3, 4}
-
差集:集合A中有而集合B中沒有的元素。
set_a = {0, 1, 2, 3, 4} set_b = {3, 4, 5, 6, 7} set_c = set_a.difference(set_b) # 返回集合a和b的差集 set_a.difference_update(set_b) # 直接把集合a中不是差集的元素去掉 print(set_c) print(set_a) out: {0, 1, 2} {0, 1, 2}
-
對等差分:集合A和B的並集再去除集合A和B的交集
set_a = {0, 1, 2, 3, 4} set_b = {3, 4, 5, 6, 7} set_c = set_a.symmetric_difference(set_b) # 返回集合a和b的對等差分 set_a.symmetric_difference_update(set_b) # 把集合a改成集合a和b的對等差分 print(set_c) print(set_a) out: {0, 1, 2, 5, 6, 7} {0, 1, 2, 5, 6, 7}
集合的查詢
-
對集合的元素做in運算。
set1 = {'頭條', 3, '集合', 2, 1, '測試'} print(5 in set1) print(1 in set1) out: False True
-
有無交集:isdisjoint方法,判斷集合A和B有沒有交集,有返回False,沒有返回True。
set_a = {0, 1, 2, 3, 4} set_b = {3, 4, 5, 6, 7} set_c = {8, 9, 10} print(set_a.isdisjoint(set_b)) print(set_a.isdisjoint(set_c)) out: False True
-
是否子集:issubset方法,判斷集合A是不是集合B的子集,是返回True,不是返回False。
set_a = {3, 4} set_b = {3, 4, 5, 6, 7} set_c = {8, 9, 10} print(set_a.issubset(set_b)) print(set_c.issubset(set_b)) out: True False
-
是否父集:issuperset方法,判斷集合A是不是集合B的父集,是返回True,不是返回False。
set_a = {3, 4} set_b = {3, 4, 5, 6, 7} set_c = {8, 9, 10} print(set_b.issuperset(set_a)) print(set_b.issuperset(set_c)) out: True False
集合的其他方法
集合的內建方法非常豐富,除了上述說過的方法外,還有len和copy。
- len,返回集合的元素長度。
- copy,建立集合的副本,內容一致,id不同。(注意:巢狀結構要用deepcopy)。
以下是案例:
set_a = {0, 1, 2, 3, 4}
print(len(set_a))
set_b = set_a.copy()
print(id(set_a), id(set_b))
out:
5
2269718817472 2269718817024
集合的特殊用法
集合有去重功能,非常強大。關於集合去重功能的運用我舉2個特殊的用法:
-
一行程式碼判斷是否有重複元素。
list1 = [1, 1, 2, 3, 4, 5] list2 = [1, 2, 3, 4, 5, 6] str1 = "aabbcdefg" str2 = "abcdefghi" print(len(set(list1)) == len(list1)) # 不相等表示有重複 print(len(set(list2)) == len(list2)) # 相等表示無重複 print(len(set(str1)) == len(str1)) # 不相等表示有重複 print(len(set(str2)) == len(str2)) # 相等表示無重複 out: False True False True
-
二行程式碼實現去重並保持原有順序。
list1 = [1, 1, 2, 3, 4, 5] list2 = list(set(list1)) list2.sort(key=list1.index) print(list2) out: [1, 2, 3, 4, 5]