一、概述
集合(set)是一種無序且不重複的序列。
無序不重複的特點決定它存在以下的應用場景:
- 去重處理
- 關係測試
差集、並集、交集等,下文詳述。
二、建立集合
建立集合的方法與建立字典類似,但沒有鍵值對的概念,具體如下:
s1 = {11,22,33}
還可以通過以下兩種方法建立:
s2 = set()
s3 = set([11,22,33])
這兩種方法本質上是同一種,都是通過呼叫系統的set()方法進行引數傳遞和型別轉換,如果不傳入引數則直接new一個空的集合;如果傳入的引數有重複的元素則直接去重處理。
三、集合的常見函式用法
3.1 元素物件常見操作
- add()
新增一個元素到指定的集合,每次只能新增一個。
s1 = {"Java", "PHP", "C++"} print(s1) s1.add("Python") print(s1) 輸出: {'C++', 'PHP', 'Java'} {'C++', 'Python', 'PHP', 'Java'}
- remove()
刪除集合中指定的物件,一次只能刪除一個,如果該物件不存在則報錯。
s1 = {'Java', 'PHP', 'Python', 'C++'} s1.remove("C++") print(s1) s1.remove("C#") #移除不存在的物件 輸出: Traceback (most recent call last): File "D:/python/S13/Day3/set.py", line 8, in <module> s1.remove("C#") KeyError: 'C#' {'Java', 'PHP', 'Python'} #第一次成功移除C++,C#不存在,移除時報錯
- discard()
與remove()類似,也是刪除指定的物件,一次只能刪除一個,但是如果該物件不存在時不報錯。
s1 = {'Java', 'PHP', 'Python', 'C++'} s1.discard("C++") s1.discard("C#") print(s1) 輸出: {'Python', 'PHP', 'Java'}
- pop()
刪除集合中任意一個物件,注意不能指定。
s1 = {'Java', 'PHP', 'Python', 'C++'} s1.pop() print(s1) 輸出: 執行多次會發現輸出的s1不固定
- clear()
清空集合。
s1 = {'Java', 'PHP', 'Python', 'C++'} s1.clear() print(s1) print(len(s1)) 輸出: set() 0
3.2 關係測試常見操作
關係測試常用於對兩個集合的關係判定。
- difference()
語法結構: set1.difference(set2)或set1 - set2
差集關係運算,以新的set集合形式返回set1中包含,但在set2中不存在的元素集合(不影響原set1和set2)。
s1 = {'Java', 'PHP', 'Python', 'C++'} s2 = {'Java', 'Shell', 'Ruby'} print(s1.difference(s2)) print(s1 - s2) print(s1) print(s2) 輸出: {'PHP', 'Python', 'C++'} {'PHP', 'Python', 'C++'} {'PHP', 'Python', 'C++', 'Java'} {'Shell', 'Java', 'Ruby'}
- issubset()
語法結構: set1.issubset(set2)
判斷集合set1是否為set2的子集,返回布林值。
s1 = {'Java', 'PHP', 'Python', 'C++'} s2 = {'Java', 'Shell', 'Ruby'} print(s1.issubset(s2)) 輸出: False
- issuperset()
語法結構: set1.issuperset(set2)
判斷set1是否為set2的父集。
s1 = {'Java', 'PHP', 'Python', 'C++'} s2 = {'Java', 'C++'} print(s1.issuperset(s2)) 輸出: True
- isdisjoint()
語法結構: set1.isdisjoint(set2)
判斷set1和set2是否存在交集, 如果不存在返回True, 存在則返回False.
s1 = {'Java', 'PHP', 'Python', 'C++'} s2 = {'Java', 'C++'} s3 = {'GO'} print(s1.isdisjoint(s2)) print(s1.isdisjoint(s3)) 輸出: False True
- symmetric_difference()
語法結構:set1.symmetric_difference(set2)或set1 ^ set2
返回set1和set2的對稱式差集,相當於執行set1.difference(set2)和set2.difference(set1),以新的set集合形式返回set1和set2中差異部分元素(不在兩者中同時存在)集合(僅在set1和set2中出現過一次的元素不影響原set1和set2)。
s1 = {'Java', 'PHP', 'Python', 'C++'} s2 = {'Java', 'Shell', 'Ruby'} print(s1.symmetric_difference(s2)) print(s1 ^ s2) 輸出: {'PHP', 'Ruby', 'Shell', 'C++', 'Python'} {'PHP', 'Ruby', 'Shell', 'C++', 'Python'}
- symmetric_difference_update()
語法結構:set1.symmetric_difference(set2)
返回set1和set2的對稱式差集,並覆蓋更新原set1集合(原來被呼叫操作的物件),即執行set1 = set1.symmetric_difference(set2)
s1 = {'Java', 'PHP', 'Python', 'C++'} s2 = {'Java', 'Shell', 'Ruby'} print(s1.symmetric_difference(s2)) s1.symmetric_difference_update(s2) print(s1) 輸出: {'PHP', 'C++', 'Shell', 'Python', 'Ruby'} {'Python', 'Shell', 'Ruby', 'PHP', 'C++'}
- intersection()
語法結構: set1.intersection(set2)或set1 & set2
交集運算,以set方式返回set1和set2的交集部分(同時存在的元素),不影響原集合set1和set2.
s1 = {'Java', 'PHP', 'Python', 'C++'} s2 = {'Java', 'Shell', 'Ruby'} print(s1.intersection(s2)) 輸出: {'Java'}
- intersection_update()
語法結構: set1.intersection_update(set2)
執行交集運算,並將結果覆蓋更新原集合set1(原來被呼叫操作的物件)。
s1 = {'Java', 'PHP', 'Python', 'C++'} s2 = {'Java', 'Shell', 'Ruby'} s1.intersection_update(s2) print(s1) 輸出: {'Java'}
- union()
語法結構: set1.union(set2)或set1 | set2
執行並集計算,合併set1和set2中的物件並做去重處理,最後以集合形式返回結果。
綜合上述關係運算函式,可確定並集計算相當於對稱差集與交集的並集計算,即合併重複重現的物件和不重複出現的物件,set1.union(set2) = (set1.symmetric_difference(set2)).union(set1.intersection(set2))s1 = {'Java', 'PHP', 'Python', 'C++'} s2 = {'Java', 'Shell', 'Ruby'} print(s1.union(s2)) 輸出: {'Shell', 'PHP', 'Ruby', 'C++', 'Python', 'Java'}
- update()
語法結構: set1.update(obj)
往集合中批量新增元素,新增的物件必須是可以迭代的物件(當然如果原集合中存在與迭代物件中重複的元素會做去重處理),本質上是通過迴圈,把傳入的迭代物件逐個新增更新到原集合中。
s1 = {'Java', 'PHP', 'Python', 'C++'} s2 = {'Java', 'Shell', 'Ruby'} s1.update(s2) print(s1) 輸出: {'Python', 'Ruby', 'Shell', 'C++', 'Java', 'PHP'}
- in 或not in
成員運算函式同樣適用於集合,最後返回布林值。
s1 = {'Java', 'PHP', 'Python', 'C++'} print('Java' in s1) if 'Go' in s1: print("OK") else: print("Not OK") 輸出: True Not OK
- <=
語法結構: set1 <= set2
判斷set1中的每個元素是否都在set2中,即判斷set1是否為set2的子集,等同於set1.issubset(set2)
s1 = {'Java', 'PHP', 'Python', 'C++'} s2 = {'Java', 'Shell', 'Ruby'} s3 = s1.union(s2) print(s1 <= s2) print(s1.issubset(s2)) print(s1 <= s3) print(s1.issubset(s3)) 輸出: False False True True
3.3 關係測試運算子
常見的關係測試運算子如下:
s1 = {'Java', 'PHP', 'Python', 'C++'} s2 = {'Java', 'Shell', 'Ruby'} print(s1 - s2) print(s1.difference(s2)) print("") print(s1 & s2) print(s1.intersection(s2)) print("") print(s1 | s2) print(s1.union(s2)) print("") print(s1 ^ s2) print(s1.symmetric_difference(s2)) print("") print(s1 <= s2) print(s1.issubset(s2)) 輸出: {'C++', 'PHP', 'Python'} {'C++', 'PHP', 'Python'} {'Java'} {'Java'} {'C++', 'Python', 'Shell', 'Ruby', 'Java', 'PHP'} {'C++', 'Python', 'Shell', 'Ruby', 'Java', 'PHP'} {'C++', 'Shell', 'Python', 'Ruby', 'PHP'} {'C++', 'Shell', 'Python', 'Ruby', 'PHP'}
False
False