Python 3 Fundamentals Week 13 - Sets 課程筆記

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)

  • 子集和母集支援用 comparison operators 進行運算
    >>> S2 > S1
    True
    >>> S1 > S2
    False
    >>> S2 >= S1
    True
    
    >>> S2 > S1
    False
    >>> S1 > S2
    False
    >>> S2 >= S1
    True
    >>> S2 = S1
    True
    

交集 (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個讚