Python學習之路day3-集合


一、概述

  集合(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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM