python set集合


集合set

  • 可變的
  • 無序的
  • 不重復的元素集合

set定義 初始化

set() 生成一個空集合

set(iterable) 可通過可迭代對象生產一個新的集合

s1 = set()
s2 = set(range(5))
s3 = set(list(range(10)))
s4 = {} #這是字典的定義方法
s5 = {9,10,11} # set
s6 = {(1,2),3,'a'}
s7 = {[1],(1,),1} # set的元素要求必須可以hash  列表不能hash
  • set的元素要求必須可以hash
  • 目前學過的不可hash的類型有list、set
  • 元素不可以索引
  • set可以迭代

set增加

add(elem)

  • 增加一個元素到set中
  • 如果元素存在,什么都不做

update(*others)

  • 合並其他元素到set元素中來
  • 參數others必須是可迭代對象
  • 就地修改

set刪除

remove(elem)

  • 從set中移除一個元素
  • 元素不存在,拋出異常keyError異常

discard(elem)

  • 從set中移除一個元素
  • 元素不存在,什么都不做

pop() -> item

  • 移除並返回任意的元素
  • 空集返回KeyError異常

clear()

  • 移除所有元素

集合

基本概念

全集

  • 所有元素的集合。例如實數集,所有實數組成的集合就是全集

子集subset和超集superset

  • 一個集合A所有元素都在另一個集合B內,A是B的子集,B是A的超集

真子集和真超集

  • A是B的子集,切A不等於B,A就是B的真子集,B是A的真超集

並集

  • 多個集合合並的結果

交集

  • 多個集合的公共部分

差集

  • 集合中除去和其他集合的公共部分

集合運算

並集

  • 將兩個集合A和B的所有元素合並在一起,組成的集合稱作集合A與集合B的並集
  • union(*others) 返回和多個元素合並后的新集合
  • | 運算符重載  等同union
  • update(*others) 和多個集合合並,就地修改
  • |= 等同update

交集

  • 集合A和集合B,由所有屬於A且屬於B的元素組成的集合
  • intersection(*others)  返回和多個集合的並集
  • & 等同於intersection
  • intersection_update(*others) 獲取和多個集合的交集,並就地修改
  • &= 等同於intersection_update

差集

  • 集合A和B,由所有屬於A切不屬於B的元素組成的元素
  • difference(*other) 返回和多個集合的差集
  • - 等同於difference
  • difference_update(*other)  獲取和多個集合的差集並就地修改
  • -= 等同於difference_update

對稱差集

  • 集合A和B,由所有不屬於A和B的交集元素組成的集合,記作(A-B) U (B-A)
  • symmetric_difference(other) 返回和另一個集合的差集
  • ^ 等同於symmetric_difference
  • symmetric_difference_update(other) 獲取和另一個集合的差集就地修改
  • ^= 等同於symmetric_difference_update

issubset(other)、<=

  • 判斷當前集合是否是另一個集合的子集

set1 < set2

  • 判斷set1是否是set2的真子集

issuperset(other)、>=

  • 判斷當前集合是否是other的超集

set1 > set2

  • 判斷set1是否是set的真超集

isdisjoint(other)

  • 當前集合和另一個集合沒有交集
  • 沒有交集、返回True

集合應用

1、共同好友

你的好友A、B、C,他的好友B、C、D,求共同好友

{"A","B","C"}.intersection({"B","C","D"})

2、微信群提醒

XXX與群里的其他人都不是微信朋友關系

  • 並集,所有的群里的人的好友形成一個並集,userid in (A|B|C|...) ,用戶id不存在這個並集中,說明他和任何人都不是朋友

3、權限判斷

有一個API,要求權限同時具備A、B、C才能訪問,用戶權限是B、C、D,判斷用戶是否能訪問該API

  • API集合A,權限集合P
  • A - P = {} , A-P為空集,說明P包含A
  • A.issubset(P) 也行,A是P的子集也行
  • A & P = A 也行

有一個API,要求權限具備A、B、C任意一項就可以訪問,用戶權限B、C、D,判斷用戶是否能訪問該API

  • API集合A,權限集合P
  • A & P != {} 就可以
  • A.isdisjoint(P) == False 表示有交集

4、一個總任務列表,存儲所有任務。一個完成的任務列表。找出為未完成的任務

  • 業務中,任務ID一般不可以重復
  • 所有已完成任務ID放到一個set中,假設為COMPLETED,它是ALL的子集
  • ALL - COMPLETED = UNCOMPLETED

集合練習

隨機產生2組各10個數字的列表,如下要求:

  • 每個數字取值范圍[10,20]
  • 統計20個數字中,一共有多少個不同的數字  #交集
  • 2組之間進行比較,不重復的數字有幾個?分別是什么?  #對稱差集
  • 2組之間進行比較,重復的數字有幾個?分別是什么?  #並集
a = [1, 9, 7, 5, 6, 7, 8, 8, 2, 6] 
b = [1, 9, 0, 5, 6, 4, 8, 3, 2, 3] 
s1 = set(a)
s2 = set(b)
print(s1) #去重
print(s2) #去重
print(s1.union(s2)) #並集 去重
print(s1.symmetric_difference(s2))  #對稱差集
print(s1.intersection(s2))   #交集

 


免責聲明!

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



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