集合: 無序的, 不可隨機訪問的, 不可重複的集合
集合分為可變集合和不可變集合
定義
- 可變集合定義方式:
{元素1, 元素2...}
s = {1, 2, 3} 複製程式碼
set(iterable)
: 其中iterable
可以是字串、列表、元組、字典等
# iterable是字串時 s = set("abc") print(s) # 列印: {'a', 'b', 'c'} 複製程式碼
# iterable是陣列時 s = set([1, 2, 3]) print(s) # 列印: {1, 2, 3} 複製程式碼
# iterable是元組時 s = set((1, 2, 3, "a", "b", "c")) print(s) # 列印: {1, 2, 3, 'c', 'b', 'a'} 複製程式碼
# iterable是字典時, 取key值做為集合元素 s = set({"name":"zhangsan", "age": 18}) print(s) # 列印: {'name', 'age'} 複製程式碼
- 集合推導式:
set(表示式 for迴圈 if語句)
,if語句可以省略
s = set(x**2 for x in range(10) if x % 2 == 0) print(s) # 列印: {0, 64, 4, 36, 16} 複製程式碼
- 不可變集合定義方式:
fs = frozenset(iterable)
: 其中iterable
可以是字串、列表、元組、字典等
# iterable是字串時 s = frozenset("abc") print(s) # 列印: frozenset({'a', 'b', 'c'}) 複製程式碼
# iterable是陣列時 s = frozenset([1, 2, 3]) print(s) # 列印: frozenset({1, 2, 3}) 複製程式碼
# iterable是元組時 s = frozenset((1, 2, 3, "a", "b", "c")) print(s) # 列印: frozenset({1, 2, 3, 'b', 'a', 'c'}) 複製程式碼
# iterable是字典時, 取key值做為集合元素 s = frozenset({"name":"zhangsan", "age": 18}) print(s) # 列印: frozenset({'age', 'name'}) 複製程式碼
- 集合推導式:
frozenset(表示式 for迴圈 if語句)
,if語句
可以省略
s = frozenset(x**2 for x in range(10) if x % 2 == 0) print(s) # 列印: frozenset({0, 64, 4, 36, 16}) 複製程式碼
注意:
- 建立一個空集合時, 需要使用set() 或者 frozenset(), 不能使用 s = {}, 會被識別成為字典
- 集合中的元素, 必須是可雜湊的值
- 如果集合中的元素值出現重複, 則會被合併為1個
集合的常用操作
- 可變集合:
- 增
s.add(element)
:element
為集合元素
s = {1, 2} s.add(3) print(s) # 列印: {1, 2, 3} 複製程式碼
- 刪
s.remove(element)
: 刪除指定元素, 當集合不包含該元素時報錯, 沒有返回值
# 正常刪除 s = {1, 2, 3} s.remove(2) print(s) # 列印: {1, 3} 複製程式碼
# 刪除不存在的元素, 報錯 s = {1, 2, 3} s.remove(5) # 報錯: KeyError: 5 複製程式碼
s.discard(element)
: 刪除指定元素, 元素不存在時什麼也不做, 沒有返回值
# 正常刪除 s = {1, 2, 3} s.discard(2) print(s) # 列印: {1, 3} 複製程式碼
# 刪除不存在的元素什麼也不做 s = {1, 2, 3} s.discard(5) print(s) # 列印: {1, 3} 複製程式碼
s.pop()
: 隨機刪除一個元素, 集合為空時報錯, 有返回值
# 正常刪除 s = {1, 2, 3} result = s.pop() print(result, s) # 列印: 1 {2, 3} 複製程式碼
# 元素為空時報錯 s = set() s.pop() # 報錯: KeyError: 'pop from an empty set' 複製程式碼
s.clear()
: 清空所有元素
s = {1, 2, 3} s.clear() print(s) # 列印: set() 複製程式碼
- 改: 可變集合中的元素是不可以進行修改的
- 查: 因為集合元素的位置隨機, 並且沒有
key
, 所以不能通過索引和key
值查詢for in
: 迴圈遍歷, 列印元素是隨機的
s = {1, 2, "a", 4, "b", 5, "c", 6} for element in s: print(element, end=" ") # 列印: 1 2 4 5 c 6 b a 複製程式碼
- 迭代器遍歷
- 增
- 不可變集合: 只能進行查詢操作, 與可變集合查詢方式相同
集合之間可以進行操作: 交集, 並集, 差集, 判定
- 交集
s1.intersection(s2)
: 返回兩個集合的交集, 並且不改變任何一個集合
s1 = {1, 2, 3} s2 = {3, 4, 5} result = s1.intersection(s2) print(result, s1, s2) # 列印: {3} {1, 2, 3} {3, 4, 5} 複製程式碼
- 可以使用邏輯與
&
進行省略寫法
s1 = {1, 2, 3} s2 = {3, 4, 5} result = s1 & s2 print(result, s1, s2) # 列印: {3} {1, 2, 3} {3, 4, 5} 複製程式碼
s1.intersection_update(s2)
: 獲取兩個集合的交集,s1
改變, 沒有返回值
s1 = {1, 2, 3} s2 = {3, 4, 5} result = s1.intersection_update(s2) print(result, s1, s2) # 列印: None {3} {3, 4, 5} 複製程式碼
- 並集:
s1.union(s2)
: 返回兩個集合的並集, 兩個集合不改變
s1 = {1, 2, 3} s2 = {3, 4, 5} result = s1.union(s2) print(result, s1, s2) # 列印: {1, 2, 3, 4, 5} {1, 2, 3} {3, 4, 5} 複製程式碼
- 可以使用邏輯或
|
進行簡略寫法
s1 = {1, 2, 3} s2 = {3, 4, 5} result = s1 | s2 print(result, s1, s2) # 列印: {1, 2, 3, 4, 5} {1, 2, 3} {3, 4, 5} 複製程式碼
s1.update(s2)
: 獲取兩個集合的並集, 改變s1
, 沒有返回值
s1 = {1, 2, 3} s2 = {3, 4, 5} result = s1.update(s2) print(result, s1, s2) # 列印: None {1, 2, 3, 4, 5} {3, 4, 5} 複製程式碼
- 差集
s1.difference(s2)
: 返回s1
相對於s2
的差集, 原集合不變
s1 = {1, 2, 3} s2 = {3, 4, 5} result = s1.difference(s2) print(result, s1, s2) # 列印: {1, 2} {1, 2, 3} {3, 4, 5} 複製程式碼
- 可以使用運算子
-
進行省略寫法
s1 = {1, 2, 3} s2 = {3, 4, 5} result = s1 - s2 print(result, s1, s2) # 列印: {1, 2} {1, 2, 3} {3, 4, 5} 複製程式碼
s1.difference_update(s2)
, 獲取s1
相對於s2
的差集,s1
改變, 沒有返回值
s1 = {1, 2, 3} s2 = {3, 4, 5} result = s1.difference_update(s2) print(result, s1, s2) # 列印: None {1, 2} {3, 4, 5} 複製程式碼
- 判定:
s1.isdisjoint(s2)
: 兩個集合不相交
s1 = {1, 2, 3} s2 = {2, 3, 4} result = s1.isdisjoint(s2) print(result) # 列印: False 複製程式碼
s1 = {1, 2, 3, 4} s2 = {2, 3, 4} result = s1.isdisjoint(s2) print(result) # 列印: True 複製程式碼
s1.issuperset(s2)
: s1包含s2:
s1 = {1, 2, 3} s2 = {2, 3, 4} result = s1.issuperset(s2) print(result) # 列印: False 複製程式碼
s1 = {1, 2, 3, 4} s2 = {2, 3, 4} result = s1.issuperset(s2) print(result) # 列印: True 複製程式碼
s1.issubset(s2)
: s1包含於s2, 即: s2包含s1
s1 = {1, 2, 3} s2 = {2, 3, 4} result = s1.issubset(s2) print(result) # 列印: False 複製程式碼
s1 = {1, 2, 3} s2 = {1, 2, 3, 4} result = s1.issubset(s2) print(result) # 列印: True 複製程式碼
注意: 可變與不可變集合混合運算, 返回結果型別以運算子左側為主