Python學習之路day3-集合

派森發表於2017-03-16

一、概述

  集合(set)是一種無序且不重複的序列。

  無序不重複的特點決定它存在以下的應用場景:

  • 去重處理
  • 關係測試

     差集、並集、交集等,下文詳述。

二、建立集合

  建立集合的方法與建立字典類似,但沒有鍵值對的概念,具體如下:

   s1 = {11,22,33}

  還可以通過以下兩種方法建立:

   s2 = set()

   s3 = set([11,22,33])

  這兩種方法本質上是同一種,都是通過呼叫系統的set()方法進行引數傳遞和型別轉換,如果不傳入引數則直接new一個空的集合;如果傳入的引數有重複的元素則直接去重處理。

三、集合的常見函式用法

3.1 元素物件常見操作

  • add()
    新增一個元素到指定的集合,每次只能新增一個。
    s1 = {"Java", "PHP", "C++"}
    print(s1)
    s1.add("Python")
    print(s1)
    
    輸出:
    {'C++', 'PHP', 'Java'}
    {'C++', 'Python', 'PHP', 'Java'}
    
  • remove()
    刪除集合中指定的物件,一次只能刪除一個,如果該物件不存在則報錯。
    s1 = {'Java', 'PHP', 'Python', 'C++'}
    s1.remove("C++") 
    print(s1)
    s1.remove("C#") #移除不存在的物件
    
    輸出:
    Traceback (most recent call last):
      File "D:/python/S13/Day3/set.py", line 8, in <module>
        s1.remove("C#")
    KeyError: 'C#'
    {'Java', 'PHP', 'Python'}  #第一次成功移除C++,C#不存在,移除時報錯
    
  • discard()
    與remove()類似,也是刪除指定的物件,一次只能刪除一個,但是如果該物件不存在時不報錯。
    s1 = {'Java', 'PHP', 'Python', 'C++'}
    s1.discard("C++")
    s1.discard("C#")
    print(s1)
    
    輸出:
    {'Python', 'PHP', 'Java'}
    
  • pop()
    刪除集合中任意一個物件,注意不能指定。
    s1 = {'Java', 'PHP', 'Python', 'C++'}
    s1.pop()
    print(s1)
    
    輸出:
    執行多次會發現輸出的s1不固定
  • clear()
    清空集合。
    s1 = {'Java', 'PHP', 'Python', 'C++'}
    s1.clear()
    print(s1)
    print(len(s1))
    
    輸出:
    set()
    0

 

3.2 關係測試常見操作 

  關係測試常用於對兩個集合的關係判定。

  • difference() 
    語法結構:  set1.difference(set2)或set1 - set2

    差集關係運算,以新的set集合形式返回set1中包含,但在set2中不存在的元素集合(不影響原set1和set2)。

    s1 = {'Java', 'PHP', 'Python', 'C++'}
    s2 = {'Java', 'Shell', 'Ruby'}
    print(s1.difference(s2))
    print(s1 - s2)
    print(s1)
    print(s2)
    
    輸出:
    {'PHP', 'Python', 'C++'}
    {'PHP', 'Python', 'C++'}
    {'PHP', 'Python', 'C++', 'Java'}
    {'Shell', 'Java', 'Ruby'} 
  • issubset()
    語法結構:  set1.issubset(set2)
    判斷集合set1是否為set2的子集,返回布林值。
    s1 = {'Java', 'PHP', 'Python', 'C++'}
    s2 = {'Java', 'Shell', 'Ruby'}
    print(s1.issubset(s2))
    
    輸出:
    False
  • issuperset()
    語法結構:  set1.issuperset(set2)
    判斷set1是否為set2的父集。

    s1 = {'Java', 'PHP', 'Python', 'C++'}
    s2 = {'Java', 'C++'}
    print(s1.issuperset(s2))
    
    輸出:
    True
  • isdisjoint()
    語法結構:  set1.isdisjoint(set2)
    判斷set1和set2是否存在交集, 如果不存在返回True, 存在則返回False.
    s1 = {'Java', 'PHP', 'Python', 'C++'}
    s2 = {'Java', 'C++'}
    s3 = {'GO'}
    print(s1.isdisjoint(s2))
    print(s1.isdisjoint(s3))
    
    輸出:
    False
    True
  • symmetric_difference()
    語法結構:set1.symmetric_difference(set2)或set1 ^ set2
    返回set1和set2的對稱式差集,相當於執行set1.difference(set2)和set2.difference(set1),以新的set集合形式返回set1和set2中差異部分元素(不在兩者中同時存在)集合(僅在set1和set2中出現過一次的元素不影響原set1和set2)。
    s1 = {'Java', 'PHP', 'Python', 'C++'}
    s2 = {'Java', 'Shell', 'Ruby'}
    print(s1.symmetric_difference(s2))
    print(s1 ^ s2)
    
    輸出:
    {'PHP', 'Ruby', 'Shell', 'C++', 'Python'}
    {'PHP', 'Ruby', 'Shell', 'C++', 'Python'}
  • symmetric_difference_update()
    語法結構:set1.symmetric_difference(set2)
    返回set1和set2的對稱式差集,並覆蓋更新原set1集合(原來被呼叫操作的物件),即執行set1 = set1.symmetric_difference(set2)
    s1 = {'Java', 'PHP', 'Python', 'C++'}
    s2 = {'Java', 'Shell', 'Ruby'}
    print(s1.symmetric_difference(s2))
    s1.symmetric_difference_update(s2)
    print(s1)
    
    輸出:
    {'PHP', 'C++', 'Shell', 'Python', 'Ruby'}
    {'Python', 'Shell', 'Ruby', 'PHP', 'C++'}
  • intersection()
    語法結構:  set1.intersection(set2)或set1 & set2
    交集運算,以set方式返回set1和set2的交集部分(同時存在的元素),不影響原集合set1和set2.
    s1 = {'Java', 'PHP', 'Python', 'C++'}
    s2 = {'Java', 'Shell', 'Ruby'}
    print(s1.intersection(s2))
    
    輸出:
    {'Java'}
  • intersection_update()
    語法結構:  set1.intersection_update(set2)
    執行交集運算,並將結果覆蓋更新原集合set1(原來被呼叫操作的物件)。
    s1 = {'Java', 'PHP', 'Python', 'C++'}
    s2 = {'Java', 'Shell', 'Ruby'}
    s1.intersection_update(s2)
    print(s1)
    
    輸出:
    {'Java'}
  • union()
    語法結構:  set1.union(set2)或set1 | set2
    執行並集計算,合併set1和set2中的物件並做去重處理,最後以集合形式返回結果。
    綜合上述關係運算函式,可確定並集計算相當於對稱差集與交集的並集計算,即合併重複重現的物件和不重複出現的物件,
    set1.union(set2) = (set1.symmetric_difference(set2)).union(set1.intersection(set2))
    s1 = {'Java', 'PHP', 'Python', 'C++'}
    s2 = {'Java', 'Shell', 'Ruby'}
    print(s1.union(s2))
    
    輸出:
    {'Shell', 'PHP', 'Ruby', 'C++', 'Python', 'Java'}
  • update()
    語法結構:  set1.update(obj)
    往集合中批量新增元素,新增的物件必須是可以迭代的物件(當然如果原集合中存在與迭代物件中重複的元素會做去重處理),本質上是通過迴圈,把傳入的迭代物件逐個新增更新到原集合中。
    s1 = {'Java', 'PHP', 'Python', 'C++'}
    s2 = {'Java', 'Shell', 'Ruby'}
    s1.update(s2)
    print(s1)
    
    輸出:
    {'Python', 'Ruby', 'Shell', 'C++', 'Java', 'PHP'}
  • in 或not in
    成員運算函式同樣適用於集合,最後返回布林值。
    s1 = {'Java', 'PHP', 'Python', 'C++'}
    print('Java' in s1)
    if 'Go' in s1:
        print("OK")
    else:
        print("Not OK")
    
    輸出:
    True
    Not OK
  • <=
    語法結構:  set1 <= set2
    判斷set1中的每個元素是否都在set2中,即判斷set1是否為set2的子集,等同於set1.issubset(set2)
    s1 = {'Java', 'PHP', 'Python', 'C++'}
    s2 = {'Java', 'Shell', 'Ruby'}
    s3 = s1.union(s2)
    print(s1 <= s2)
    print(s1.issubset(s2))
    print(s1 <= s3)
    print(s1.issubset(s3))
    
    輸出:
    False
    False
    True
    True

 

3.3 關係測試運算子

  常見的關係測試運算子如下:

 

s1 = {'Java', 'PHP', 'Python', 'C++'}
s2 = {'Java', 'Shell', 'Ruby'}
print(s1 - s2)
print(s1.difference(s2))
print("")
print(s1 & s2)
print(s1.intersection(s2))
print("")
print(s1 | s2)
print(s1.union(s2))
print("")
print(s1 ^ s2)
print(s1.symmetric_difference(s2))
print("")
print(s1 <= s2)
print(s1.issubset(s2))

輸出:
{'C++', 'PHP', 'Python'}
{'C++', 'PHP', 'Python'}

{'Java'}
{'Java'}

{'C++', 'Python', 'Shell', 'Ruby', 'Java', 'PHP'}
{'C++', 'Python', 'Shell', 'Ruby', 'Java', 'PHP'}

{'C++', 'Shell', 'Python', 'Ruby', 'PHP'}
{'C++', 'Shell', 'Python', 'Ruby', 'PHP'}

False
False

 

相關文章