Python基礎(八): 集合

weixin_34253539發表於2018-01-12

集合: 無序的, 不可隨機訪問的, 不可重複的集合

集合分為可變集合和不可變集合

定義

  • 可變集合定義方式:
    • {元素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})
    複製程式碼

注意:

  1. 建立一個空集合時, 需要使用set() 或者 frozenset(), 不能使用 s = {}, 會被識別成為字典
  2. 集合中的元素, 必須是可雜湊的值
  3. 如果集合中的元素值出現重複, 則會被合併為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
    複製程式碼

注意: 可變與不可變集合混合運算, 返回結果型別以運算子左側為主

相關文章