set 定義
集合(Set)是一種無序且不重複的資料結構,用於儲存一組唯一的元素。時間複雜度O(1)。
集合是由一對花括號 {} 構成,其中每個元素之間用逗號分隔。
集合中的元素必須是不可變的(不可修改),可以包含數字、字串、元組等不可變型別。
集合中的元素不重複,即集合中每個元素是唯一的。
集合是無序的,不能透過索引訪問,因此不能像列表那樣使用索引或切片。
set 使用場景
集合是在需要儲存唯一元素、進行集合運算、快速查詢和去重等場景下非常實用的資料結構。它們具有高效的成員檢查和集合操作功能,能夠簡化程式碼並提高程式執行效率。
去重:當需要去除列表或其他可迭代物件中的重複元素時,使用集合可以很方便地去除重複項。
集合運算:集合提供了並集、交集、補集等集合運算方法,使得處理集合資料時更加方便。
成員檢查:使用集合可以快速檢查某個元素是否屬於集合,因為集合的成員檢查是高效的。
資料篩選:可以使用集合推導式對資料進行篩選和處理,這在處理資料中是非常常見的。
快速查詢:當需要快速查詢是否包含某個元素時,集合的查詢速度比列表快,因為集合使用雜湊表來儲存元素。
set 初始化
特點:集合中的元素是唯一的,無序的,且不可變(不可雜湊)。集合內部元素無索引,因此不能透過索引進行訪問或切片。
建立集合:可以使用set()建構函式建立集合,也可以使用花括號{}來定義集合。
重複元素:集合會自動去除重複的元素,確保所有元素都是唯一的。
# 使用 set() 建構函式
my_set = set([1, 2, 3, 2, 3])
print(type(my_set), my_set) # 輸出: <class 'set'> {1, 2, 3}
# 使用花括號 {}
my_set2 = {4, 5, 6, 5}
print(type(my_set2),my_set2) # 輸出: <class 'set'> {4, 5, 6}
my_set3 = set()
print(type(my_set3),my_set3) # 輸出: <class 'set'> set()
my_set4 = {}
print(type(my_set4),my_set4) # 輸出: <class 'dict'> {}
my_set5 = {[1],(1,),1}
print(type(my_set5),my_set5) # 輸出: TypeError: unhashable type: 'list'
set 增加元素
add(elem):增加一個元素到set中。如果元素存在,什麼都不做。
update(*others):合併其他元素到set集合中來。引數others必須是可迭代物件。就地修改。
# add()
my_set = {1, 2, 3}
my_set.add(4)
print(my_set) # 輸出: {1, 2, 3, 4}
# 使用 update 方法將 set2 中的元素新增到 set1 中
set1 = {1, 2, 3}
set2 = {3, 4, 5}
set1.update(set2)
print(set1) # 輸出: {1, 2, 3, 4, 5}
# 使用 update 方法將列表中的元素新增到集合中
set3 = {1, 2, 3}
my_list = [4, 5, 3]
set3.update(my_list)
print(set3) # 輸出: {1, 2, 3, 4, 5}
# 使用 update 方法將多個集合中的元素合併到一個集合中
set5 = {1, 2, 3}
set6 = {3, 4, 5}
set7 = {5, 6, 7}
set5.update(set6, set7)
print(set5) # 輸出: {1, 2, 3, 4, 5, 6, 7}
set 刪除元素
使用 remove() 方法可以刪除指定的元素,如果元素不存在會引發 KeyError。
使用 discard() 方法也可以刪除指定的元素,但如果元素不存在不會產生錯誤。
使用 pop() 方法會隨機刪除集合中的一個元素,並返回被刪除的元素。
使用 clear() 移除所有元素。
my_set = {1, 2, 3}
my_set.remove(2)
print(my_set) # 輸出: {1, 3}
my_set.discard(3)
print(my_set) # 輸出: {1}
my_set.clear()
print(my_set) # 輸出:set()
set 查詢元素
可以透過 in 運算子檢查元素是否存在於集合中。
my_set = {1, 2, 3}
print(2 in my_set) # 輸出: True
print(4 in my_set) # 輸出: False
set 集合
set 集合概念
全集(Universal Set):全集是指包含所有可能元素的集合。在Python中,可以使用任何包含所有元素的集合來表示全集。
子集(Subset):如果集合A中的所有元素都在集合B中,那麼集合A是集合B的子集。
並集(Union):集合的並集包含了兩個集合中所有的獨特元素。
交集(Intersection):集合的交集包含同時存在於兩個集合中的元素。
差集(Difference):集合的差集包含存在於第一個集合中但不存在於第二個集合中的元素。
超集(Superset):如果集合A包含集合B中所有的元素,那麼集合A是集合B的超集。
set 並集
集合的並集包含了兩個集合中所有的唯一元素。
可以使用union()方法、|運算子 update()方法,以及|=運算子(原地更新)來計算集合的並集。
並集的結果是一個新的集合,包含兩個原始集合中的所有唯一元素。
union() 方法:用於計算兩個集合的並集。
| 運算子:也用於計算兩個集合的並集。
|= 運算子:用於原地更新集合,將左側的集合更新為其與右側集合的並集。
update():和多個集合合併,就地修改。
set1 = {1, 2, 3}
set2 = {3, 4, 5}
# 使用 | 運算子計算並集
union_set_operator = set1 | set2
print(union_set_operator) # 輸出: {1, 2, 3, 4, 5}
# 使用 |= 運算子更新集合為並集
set1 |= set2
print(set1) # 輸出: {1, 2, 3, 4, 5}
# 使用update()方法
set1.update(set2)
print(set1) # 輸出: {1, 2, 3, 4, 5}
set 交集
集合的交集包含了同時存在於兩個集合中的元素。
可以使用intersection()方法、&運算子,以及intersection_update()方法和&=運算子進行交集運算。
交集的結果是一個新的集合,包含兩個原始集合共同的元素。
intersection() 方法:用於計算兩個集合的交集。
& 運算子:也用於計算兩個集合的交集。
intersection_update() 方法:用於就地更新集合為交集。
&= 運算子:用於原地更新集合為交集。
set1 = {1, 2, 3}
set2 = {3, 4, 5}
# 使用 & 運算子計算交集
intersection_set_operator = set1 & set2
print(intersection_set_operator) # 輸出: {3}
# 使用 intersection() 方法計算交集
intersection_set_method = set1.intersection(set2)
print(intersection_set_method) # 輸出: {3}
# 使用 &= 運算子更新集合為交集
set1 &= set2
print(set1) # 輸出: {3}
# 使用 intersection_update() 方法更新集合為交集
set1.intersection_update(set2)
print(set1) # 輸出: {3}
set 差集
集合的差集包含屬於第一個集合但不屬於其他指定集合的元素。
可以使用difference()方法、-運算子,以及difference_update()方法和-=運算子進行差集運算。
差集的結果是一個新的集合,包含第一個集合中存在但其他指定集合中不存在的元素。
difference() 方法:用於計算第一個集合相對於其他集合的差集。
- 運算子:也用於計算兩個集合的差集。
difference_update() 方法:用於就地更新集合為差集。
-= 運算子:用於原地更新集合為差集。
set1 = {1, 2, 3, 4}
set2 = {3, 4, 5}
# 使用 - 運算子計算差集
difference_set_operator = set1 - set2
print(difference_set_operator) # 輸出: {1, 2}
# 使用 difference() 方法計算差集
difference_set_method = set1.difference(set2)
print(difference_set_method) # 輸出: {1, 2}
# 使用 -= 運算子更新集合為差集
set1 -= set2
print(set1) # 輸出: {1, 2}
# 使用 difference_update() 方法更新集合為差集
set1.difference(set2)
print(set1) # 輸出:{1, 2}
set 對稱差集
集合的對稱差集包含兩個集合中除了交集外的所有唯一元素。
可以使用symmetric_difference()方法、^運算子,以及symmetric_difference_update()方法和^=運算子進行對稱差集運算。
對稱差集的結果是一個新的集合,包含兩個集合中除了交集外的所有唯一元素。
symmetric_difference() 方法:用於計算兩個集合的對稱差集。
^ 運算子:也用於計算兩個集合的對稱差集。
symmetric_difference_update() 方法:用於就地更新集合為對稱差集。
^= 運算子:用於原地更新集合為對稱差集。
set1 = {1, 2, 3}
set2 = {3, 4, 5}
# 使用 ^ 運算子計算對稱差集
symmetric_difference_set_operator = set1 ^ set2
print(symmetric_difference_set_operator) # 輸出: {1, 2, 4, 5}
# 使用 symmetric_difference() 方法計算對稱差集
symmetric_difference_set_method = set1.symmetric_difference(set2)
print(symmetric_difference_set_method) # 輸出: {1, 2, 4, 5}
# 使用 ^= 運算子更新集合為對稱差集
set1 ^= set2
print(set1) # 輸出: {1, 2, 4, 5}
# 使用 symmetric_difference_update() 方法更新集合為對稱差集
set1.symmetric_difference(set2)
print(set1) # 輸出: {1, 2, 4, 5}
set 比較
可以使用邏輯運算子(如 == 、!=、< 、>、<=、>=)來比較兩個集合是否相等、不相等,或者判斷集合的子集關係
set1 = {1, 2, 3, 4}
set2 = {3, 4, 5}
# 相等(==):檢查兩個集合是否相等
print(set1 == set2) # 輸出: False
# 不相等(!=):檢查兩個集合是否不相等
print(set1 != set2) # 輸出: True
# 子集(<):檢查第一個集合是否是第二個集合的子集
print(set1 < set2) # 輸出: False
# 子集(子集或相等)(<=):檢查第一個集合是否是第二個集合的子集。
print(set1 <= set2) # 輸出: False
# 真子集(>):檢查第一個集合是否是第二個集合的真子集
print(set1 > set2) # 輸出: False
# 超集(>=):檢查第一個集合是否是第二個集合的超集
print(set1 >= set2) # 輸出: False
set1 = {1, 2, 3, 4}
set2 = {2, 3}
set3 = {5, 6}
# 檢查 set2 是否是 set1 的子集
print(set2.issubset(set1)) # 輸出: True
# 檢查 set1 是否是 set2 的超集
print(set1.issuperset(set2)) # 輸出: True
# 檢查 set3 是否是 set1 的子集
print(set3.issubset(set1)) # 輸出: False
# 檢查 set1 和 set3 是否不相交
print(set1.isdisjoint(set3)) # 輸出: True
參考文件
https://docs.python.org/zh-cn/3.12/library/stdtypes.html#/set-types-set-frozenset