python-集合(set)知識整理



####   集合     ####

  • set 集合 和 線性結構

  • 線性結構  的查詢時間復雜度是  O(n),即隨着數據規模的增大而增加耗時。
  • set集合 ,dict 字典  等結構,內部使用hash值作為key,時間復雜度可以做到O(1),查詢時間和數據規模無關
  • 可hash
    • 數字型:int、float、complex
    • 布爾型:True、False
    • 字符串:string、bytes
    • 元組:tuple
    • None
    • 以上都是不可變類型,成為可哈希 類型
set  的元素必須是可hash的。*** 不管你嵌套多少層,只要有不可哈希的元素就會報錯 !!!


集合特性: 1、元素必須是不可變類型(數字,字符串,元組),必須可ha
   2、不同元素組成,如果相同就會自動去重,只保留一個。
      3、集合是無序的
      4、集合是可變類型

定義集合:s = {1,4,32,1}

 使用s = set()時,必須是可迭代對象才行。

 

 
        


# 集合是一個可變的、無序的,不重復的數據組合,
它的主要作用如下:
  1、去重,把一個列表變成集合,就自動去重了
  2、關系測試,測試兩組數據之前的交集、差集、並集等關系
(注:set元素要求必須可hash才能加入到set元素中)
因為沒有順序,所以無法被索引,但是可以被迭代。
list01 = [1,4,5,6,7,8,4,5,6]
print(list01,type(list01))
# [1, 4, 5, 6, 7, 8, 4, 5, 6] <class 'list'>
list01 = set(list01)
print(list01,type(list01))
# {1, 4, 5, 6, 7, 8} <class 'set'>

基本概念:
  全集
    所有元素的集合,
  子集subset和超集superset
    一個集合A所有元素都在另一個集合B內,A是B的子集,B是A的超集
  真子集和真超集
    A是B的子集,且A不等於B,A就是B的真子集,B是A的真超集。
  並集:過個集合合並的結果
  交集:多個集合的公共部分
  差集:集合中除去和其他集合公共部分



# ################### 交集 (intersection)符號為:【 & 】 #########################

 

# 交集 表示符號:& 表示 集合1和集合2 中都有的。
list02 = set([2,6,0,22,8,4])
print(list01,list02)
# {1, 4, 5, 6, 7, 8} {0, 2, 4, 6, 8, 22}
# # 交集 intersection
print(list01.intersection(list02))

# ################### 並集 (union)符號為: 【 | 】#########################

 

 
        
# 並集 表示符號:| 表示 集合1或者是集合2中有的
# # 並集 union 並起來去重
print(list01.union(list02))
# {0, 1, 2, 4, 5, 6, 7, 8, 22}

 



# ################### 差集 (difference)符號為:【 - 】 #########################

A -P = {} ,A -P 為空集,說明P包含A

 

 


# 差集表示符號:- 表示 set01 - set02 表示 set01中有的,set02中沒有的
# set02 - set01 表示 set02中有的,set01中沒有的
#  # 差集  difference list01中有的,list02中沒有的
print(list01.difference(list02))
# {1, 5, 7}
print(list02.difference(list01))
# {0, 2, 22}


# ################### 子集 (issubset) #########################
aa.issubset(bb) 進行判斷,aa是不是bb的子集

# ################### 父集 (issuperset #########################

 



# ################### 反向差集| 交叉補集| 對稱差集 (symmetric_difference)符號為:【 ^ 】 #########################

 

 



# list01和list02里面,互相都沒有的,取出來放到一塊
print(list01.symmetric_difference(list02))

########################## 集合的功能介紹及舉例說明 ###################################
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# __author__:anxu.qi
# Date:2018/12/4
#######################################################################################
a = {11, 22, 33, 44, 66, 99, "oopp",1123, "111"}
b = {11,22,88,99,"oopp","opop"}

# ##################### add 向集合中添加元素 注:一次只允許添加一個元素 ####

# a.add("vivo")
# print(a) # {33, 66, 'opop', 'vivo', 11, 44, 77, 22, 55}

# #################### clear 刪除集合的所有的元素 #################

 

# #################### copy 淺copy ####
重新賦值一份數據給s1


# #################### difference A中存在的B中不存在的 ####
# A中存在,B中不存在 返回一個新值,變量接受
c = a.difference(b)
print(c) # {33, 66, 1123, 44, '111'}
# #################### difference_update A中存在的B中不存在的,結果更新為A ####
a.difference_update(b)
print(a) # {33, 66, 1123, '111', 44}

a = {11, 22, 33, 44, 66, 99, "oopp",1123, "111"}
b = {11,22,88,99,"oopp","opop"}
# #################### discard 移除指定的元素,不存在不報錯 ####

 

 


# #################### remove 移除指定的元素,不存在則提示ERROR。 ####

 

做的是key的比較

a.discard(11111)
# #################### intersection 取出交集並賦值給cc #####
cc = a.intersection(b)
print(cc) # {11, 'oopp', 99, 22}
# #################### intersection_update 取出交集並賦值給A ####
a.intersection_update(b)
print(a) # {'oopp', 11, 99, 22}
# #################### isdisjoint 如果沒有交集返回True,有交集為False ####
print(a.isdisjoint(b)) # False
se = {11,22,33,44}
be = {11,22}
# #################### issubset # 另一個集合是否包含此集合, 子序列 ####
print(be.issubset(se)) # True
# #################### issuperset # 這個集合是否包含另一個集合 父序列 ####
print(se.issuperset(be)) # True



# #################### pop # 移除並返回任意集合元素,如果集合為空,則引發KeyError ####

aaa = se.pop() # 可以將移除的那個元素賦值給其他值 ####
print(aaa) # 33
# #################### symmetric_difference # 將se中存在的be不存在的,be不存在的se中存在的合並到了一起,賦值為dddd ####
dddd = se.symmetric_difference(be)
print(dddd) # {33, 99, 44, 77, 88}
cccc = se.symmetric_difference(be)
print(cccc) # {33, 99, 44, 77, 88}
# #################### symmetric_difference_update # 將se中存在的be不存在的,be不存在的se中存在的合並到了一起,賦值為se ####
se.symmetric_difference_update(be)
print(se) # {33, 99, 44, 77, 88}
# ##############################
se = {11,22,33,44,99}
be = {11,22,77,88}
# #################### union # 取並集 ####

 

 

 


tt = se.union(be)
print(tt) # {33, 99, 11, 44, 77, 22, 88}
# #################### update # 更新的時候,必須得是可迭代(Iterable) ####
|= 就等於update

 

 

se.update([666,888])
se.update(666,888)
print(se)
# ########################################################################################################

 

list 隨着規模的增加,效率在往下走,

set 隨着規模的增加,效率還是那樣



 

 

 集合補充:

不可變集合:frozonset

 # 不考慮順序的快速去重

 

#####有一篇介紹python集合的文章,寫的很好
https://tw.saowen.com/a/ab713431b675abe3d71cf675d04082b9601135ba484291bb2b3a95b6ccad0e4f


免責聲明!

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



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