> 確定的一組無序的數(shù)據(jù)的組合
+ 確定的? 當(dāng)前集合中元素的值不能重復(fù)
+ 由多個數(shù)據(jù)組合的復(fù)合型數(shù)據(jù)(容器類型數(shù)據(jù))
+ 集合中的數(shù)據(jù)沒有順序
+ 功能:成員檢測、從序列中去除重復(fù)項以及數(shù)學(xué)中的集合類計算桐经,例如交集拓哟、并集、差集與對稱差集等等河泳。
### 集合的定義
+ 可以直接使用 {} 來定義集合
+ 可以使用set()進(jìn)行集合的定義和轉(zhuǎn)換
+ 使用集合推導(dǎo)式完成集合的定義
**注意:集合中的元素不能重復(fù)沃呢,集合中存放的數(shù)據(jù):Number,Strings,Tuple,冰凍集合**
### 集合的基本操作和常規(guī)函數(shù)
```python
# 定義集合
vars = {123,'abc',False,'love',True,(1,2,3),0,3.1415,'123'}
# 1。無序薄霜。
# 2惰瓜。布爾類型 True 表示為 1备禀,F(xiàn)alse 表示為 0曲尸,布爾和數(shù)字只存在一個
# 3男翰。元素的值不能重復(fù)
# {0, 'abc', 'love', True, 3.1415, (1, 2, 3), 123}
# 檢測集合中的值
res = '123' in vars
res = '123' not in vars
# 獲取集合中元素的個數(shù) len()
# res = len(vars)
# 集合的遍歷
# for i in vars:
#???print(i,type(i))
# 向集合中追加元素 add()
res = vars.add('def')
# 刪除集合中的元素 隨機(jī)刪除一個元素并返回?abc False True 3.1415
# r1 = vars.pop()
# 指定刪除集合中的元素 remove() 返回None,不存在則報錯
# res = vars.remove('aaa')
# discard 指定刪除集合中的元素柴淘,不存在也不會報錯
# res = vars.discard('aaa')
# clear() 清空集合
# res = vars.clear()
# update(others) 更新集合秘通,添加來自 others 中的所有元素第股。
res = vars.update({1,2,3,4,5})
#?當(dāng)前集合中的淺拷貝并不存在 深拷貝的問題
res = vars.copy()
'''
當(dāng)前集合中的淺拷貝并不存在 深拷貝的問題
??因為集合中的元素都是不可變,包括元組和冰凍集合
??不存在拷貝后,對集合中不可變的二級容器進(jìn)行操作的問題
'''
```
### 冰凍集合(了解)
> 定義冰凍集合黄虱,只能使用 frozenset() 函數(shù)進(jìn)行冰凍集合的定義
+ 冰凍集合一旦定義不能修改
+ 冰凍集合只能做集合相關(guān)的運(yùn)算:求交集稚矿,差集晤揣,盗扒。朵耕。阎曹。
+ frozenset() 本身就是一個強(qiáng)制轉(zhuǎn)換類的函數(shù)斟湃,可以把其它任何容器類型的數(shù)據(jù)轉(zhuǎn)為冰凍集合
```python
# 定義
vars = frozenset({'love',666,'a',1,'b',2,'521'})
# vars = frozenset([1,2,3])
# 遍歷
# for i in vars:
#???print(i)
# 冰凍集合的推導(dǎo)式
res = frozenset({i<<1 for i in range(6)})
# 冰凍集合可以和普通集合一樣凝赛,進(jìn)行集合的運(yùn)算 交集捆昏。寇仓。躺枕。
# copy()
res = res.copy()
# print(res)
```
### 集合的推導(dǎo)式
```python
# 集合推導(dǎo)式
varset = {1,2,3,4}
# (1) 普通推導(dǎo)式
newset = {i<<1 for i in varset }
# (2) 帶有條件表達(dá)式的推導(dǎo)式
newset = {i<<1 for i in varset if i%2==0}
# (3) 多循環(huán)的集合推導(dǎo)式
vars1 = {1,2,3}
vars2 = {4,5,6}
# newset = set()
# for i in vars1:
#???for j in vars2:
#?????print(i,j)
#?????newset.add(i+j)
# print(newset)
newset = {i+j for i in vars1 for j in vars2}
# print(newset)
# (4) 帶條件表達(dá)式的多循環(huán)的集合推導(dǎo)式
newset = {i+j for i in vars1 for j in vars2 if i%2==0 and j%2==0}
print(newset)
```
### 集合的運(yùn)算
#### 集合的主要運(yùn)算
+ 交集?&??set.intersection()??set.intersection_update()
+ 并集?|??union()?update()
+ 差集?-??difference(),difference_update()
+ 對稱差集 ^?symmetric_difference()?symmetric_difference_update()
```python
vars1 = {'郭富城','劉德華','張學(xué)友','黎明','都敏俊',1}
vars2 = {'尼古拉斯趙四','劉能','小沈陽','宋小寶','都敏俊',1}
#?& 求兩個集合相交的部分
res = vars1 & vars2
# | 求兩個集合的并集屯远,就是把集合中所有元素全部集中起來蔓姚,(去除重復(fù))
res = vars1 | vars2
# - 差集運(yùn)算
res = vars1 - vars2 # vars1有,而慨丐,vars2 沒有的
res = vars2 - vars1 # vars2有,而泄私,vars1 沒有的
# ^ 對稱差集
res = vars1 ^ vars2
# 交集運(yùn)算函數(shù) intersection?intersection_update
# set.intersection()?# 返回交集的結(jié)果 新的集合
# res = vars1.intersection(vars2)
# set.intersection_update()?# 沒有返回值
# 計算兩個集合的相交部分房揭,把計算結(jié)果重新賦值給第一個集合
# res = vars1.intersection_update(vars2)
# 并集運(yùn)算函數(shù)?|??union()?update()
# res = vars1.union(vars2)?# 返回并集結(jié)果备闲,新的集合
# 求并集運(yùn)算,并且把結(jié)果賦值給第一個集合
# res = vars1.update(vars2) # 沒有返回值
# print(vars1)
# 差集運(yùn)算?函數(shù) difference(),difference_update()
# res = vars1.difference(vars2) # 返回差集結(jié)果?新的集合
# 把差集的結(jié)果捅暴,重新賦值給第一個集合
# res = vars1.difference_update(vars2) # 沒有返回值
# 求對稱差集
# res = vars1.symmetric_difference(vars2) # 返回對稱差集的結(jié)果?新的集合
# 把對稱差集的運(yùn)算結(jié)果恬砂,重新賦值給第一個集合
res = vars1.symmetric_difference_update(vars2)# 沒有返回值
```
#### 集合檢測
+?issuperset() 檢測是否為超集
+ issubset() 檢測是否為子集
+ isdisjoint() 檢測是否不相交
```python
# 檢測 超集?子集
vars1 = {1,2,3,4,5,6,7,8,9}
vars2 = {1,2,3}
# issuperset() 檢測是否為超集
res = vars1.issuperset(vars2)?# True?vars1是vars2的超集
res = vars2.issuperset(vars1)?# False
# issubset() 檢測是否為子集
res = vars1.issubset(vars2) #?False
res = vars2.issubset(vars1) #?True vars2是vars1的子集
# 檢測兩個集合是否相交
vars1 = {1,2,3}
vars2 = {5,6,3}
# isdisjoint 檢測是否不相交, 不相交返回True蓬痒,相交則返回False
res = vars1.isdisjoint(vars2)
print(res)
```