Introduction of Python Sets
- 概念上就像數學的集合 (Set)
- 指若干不同物件 (object) 形成的母體。集合裡的物件稱作元素 (element) 或成員 (member)
- 元素間沒有次序
- 集合內的每個元素都是獨一無二的
- 是可迭代物件
- 但不保證迭代的順序,如同從一袋彈珠裡,隨機拿一顆彈珠,直到袋子裡沒有彈珠為止
- Python Sets 支援像數學一樣的集合運算
先備知識
- union : 聯集
- intersection : 交集
- difference : 差集
- symmetric difference : 對稱差
_
- membership : 關心元素是否在集合裡
- containment : 集合彼此的子母關係
- subset : 子集。如上圖,若 A 集合的每個元素也都在 B 集合,那 A 就是 B 的子集。
- 若 B 集合的每個元素也都在 A 集合,那 A = B 。
- proper / strict subset : 真子集。A 集合的每個元素也都在 B 集合,而且 A 不可與 B 集合相同。
- superset : 超集/母集/父集。如上圖,B 集合是 A 集合的超集。
- strict superset : 真超集。 B 集合是 A 集合的超集,且 B 集合不可等於 A 集合。
Python Sets
Sets |
Dictionaries |
元素(key)的集合 |
元素(成對 key: value)的集合 |
元素間沒有次序 |
Python 3.5 前元素間沒有次序/Python 3.6 後有插入次序 |
元素不可重複 |
元素不可重複 |
可迭代物件 |
可迭代物件 |
元素必須是 hashable |
Key必須是 hashable |
Sets 本身是 mutable |
Dictionaries 本身是 mutable |
使用大括弧表示 {} |
使用大括弧表示 {} |
型別是 set |
型別是 dict |
- Sets 就像字典的 key 但沒有 value pair
- Sets 本身不是 hashable
- Set 不能被巢狀成為其他 set 的元素,或是字典的 key ,若真的有需求,可以使用
frozenset
frozenset
是集合的 immutable 版本,創建後不可再被刪改
- 如果
frozenset
裡面的元素都是 hashable ,那 frozenset
也是 hashable
Defining Sets
- 直接用
{}
內放元素
- 此方法不可宣告空集合,因為單純用
{}
會判定為空字典
>>> s = {1, 2, 3, 4, 5}
- 使用
set()
函式
- 和 list 類似,餵一個可迭代物件進去,則會將每次迭代的物件變成一個元素
>>> l = [1, 2, 3, 4, 5]
>>> s = set(l)
>>> s
{1, 2, 3, 4, 5}
常見操作
Method / Function |
Description |
in/not in |
檢查物件是否存在於 set 中 |
s.clear() |
移除集合內所有元素 (也可直接 assign 空集合 s = set() ) |
s.copy() |
創造一個 shallow copy |
s.add() |
新增元素 |
s.remove() |
移除指定元素,若元素不存在會跳錯 KeyError |
s.discard() |
捨棄指定元素,若元素不存在則不動作 |
※ 不清楚 assign 空集合是否比較占空間
※ 不清楚 remove 和 discard 是否比較推薦使用哪個 (例如速度快慢差別?)
多個集合的操作
互斥集 (Disjointedness)
- 若兩個集合沒有交集,則稱為互斥 disjoint
s1.isdisjoint(s2)
- 回傳 True 代表兩個集合互斥
- 回傳 False 代表兩個集合有交集
- 元素 a 和 元素 b 如果相等,可以寫成
a == b
子集 (Subset) 和母集 (Superset)
交集 (Intersection) 和聯集 (Union)
差集 (Difference)
永遠將 sets 記在心裡
- 用 sets 做 membership testing 比 lists 或 tuples 快非常多
- 很容易去除重複元素 set()
- 很容易找到兩個集合的共同元素 s1 & s2
- 很容易找到其中集合一個有但另一個集合沒有的元素 s1 - s2
練習題
result = set()
for sub_dict in data.values():
for key in sub_dict:
result.add(key)
result = set()
for d in data.values():
result = result | d.keys()
1個讚