一、定義
set是一個無序且不重複的元素集合。
集合對象是一組無序排列的可哈希的值,集合成員可以做字典中的鍵。集合支持用in和not in操作符檢查成員,由len()內建函數得到集合的基數(大小),用 for 循環迭代集合的成員。但是因為集合本身是無序的,不可以為集合創建索引或執行切片(slice)操作,也沒有鍵(keys)可用來獲取集合中元素的值。
set和dict一樣,只是沒有value,相當於dict的key集合,由於dict的key是不重複的,且key是不可變對象因此set也有如下特性:
1. 不重複
2. 元素為不可變對象
set的創建
本身使用 {} 進行創建,如果 {}裡面沒有元素,默認表示 dict類型,也就是創建空元素的set集合,不能用{}如果要創建一個空元素的set,使用 set()使用{} 裡面可以數值型、字符串、元組, 不可以用字典和集合,裡面可以放多個元素
· 如果使用 set,因為set需要對裡面的元素做遍歷循環,做去重操作,做無序排列,所以要求元素必須可遍歷,所以裡面可以使用字符串、元組、集合、字典
· {}裡面不能用 list集合、set裡面不能用數值型
#set裡面只能有一個參數
a = set()
print(a,type(a))
#字符串
a = set('boy')
print(a,type(a))
#元組
a = set((1,2,3))
print(a,type(a))
#集合
a = set(['a','b','c','d','e'])
print(a,type(a))
#dict
a = set({'k1':'v1','k2':'v2'})
print(a,type(a))
#set
a = set({'k1','k2'})
print(a,type(a))
#默認變成 字典 dict,不可使用
a = {}
#數值型
a = {10}
#元組
a = {(1,2,3)}
#字符串
a= {'boy','girl'}
#因為使用 {} 不會對裡面元素做修改,但是set是一個無序的,而 list是有序的
# a= {['boy','girl']}
print(a,type(a))
三、基本操作
增加元素
裡面可以放 字符串、數值型、元組不可以放list集合和字典
a = {'abc','def'}
a.add(10)
a.add('ghi')
a.add((1,2,3))
print(a)
a = set('abc')
a.add(10)
#不能添加集合
# a.add([10,20])
print(a)
刪除
remove(key)刪除裡面的元素,如果key值不存在,會報錯discard(key)刪除裡面的元素,如果key值不存在,不會報錯pop()刪除默認列印順序的第一個,不能放參數del對象 ,從內存直接清楚掉該變量,不可訪問
a = {11,44,22,88,4,76,33,23}
print(a)
d = 22
ret = a.discard(d)
print('使用discard刪除之後:',a,ret)
a.add(d)
print('重新增加刪除的元素:',a)
ret = a.remove(22)
print('使用remove刪除之後:',a,ret)
a.add(d)
print('重新增加刪除的元素:',a)
ret = a.pop()
print('使用pop刪除之後:',a,ret)
#使用del 直接刪掉變量a,刪除後不可訪問
del a
修改更新
a.update(b) 把a 和 b 合併起來並且去重,然後賦值給a, 做類似修改的操作update做修改的時候,先對 b 進行遍歷循環,然後去重,然後賦值
a = {11,33,22}
b = {22,44,55}
c = [55,66,77]
# update裡面放 一個 set
a.update(b)
# update裡面放一個集合
a.update(c)
# update裡面放一個元組
a.update((10,20,88))
#update裡面放一個set類型
a.update({'a','b'})
# update裡面放一個字典,只會遍歷 key值出來
a.update({'a':'b','aa':'bb'})
print(a)
print(b)
比較
diffrenceset1.difference(x) x可以用 集合、set、字符串、元組,如果使用字典的話,只會取 key值進行比較diffrence 不會改變原始 set的內容diffrence_updateset1.difference_update(x) 先找出set1 和 x不同的元素,不同元素不包含 x裡面的,然後將結果賦值給 set1
x.difference(y)(取x和y的不同元素,包含x的內容,不包含y的內容)x + y 然後去重
x = {11,22,33}
y = {11,44}
#判斷se 裡面的元素 和 y裡面進行比較,以se為主,結果不包含y的值,並且不會改變 se的值
temp = x.difference(y)
x = temp
#如果 y是一個字典數據,那麼只取key值判斷
# temp = x.difference({33:111,44:444})
print('比較的不同元素,不包含y裡面的值:',temp)
print('比較不同之後,不對原始數據修改:',x)
x = {11,22,33}
y = [11,44]
temp = x.difference_update(y)
print('使用difference_update 修改之後的返回:',temp)
print('使用difference_update 比較之後,原始數據變成比較結果:',x)
x.symmetric_difference(y)(取x和y的不同元素,包含x的內容,並且包含y的內容)x + y
x = {11,22,33}
y = {11,44,22}
# x和 y的交集 包含x 裡面的元素 和 y裡面的元素
temp = x.symmetric_difference(y)
print(temp)
print(x)
temp = x.symmetric_difference_update(y)
print(temp)
print(x)
如何取得兩個 集合的 交集
a. intersection(b)(表示a 和 b相同的元素)
#取相同的交集
x = {11,22,33}
y = {11,44,22}
#使用 intersection 取兩個集合的 交集,就是相同的元素
temp = x.intersection(y)
print(temp)
print(x)
#使用intersection_update 先獲取 交集列表,然後賦值給 x
temp = x.intersection_update(y)
print(temp)
print(x)
如何獲取兩個集合的 併集
union表示將ae的元素和x的元素加起來,然後去重,不會將結果直接賦值給xupdate也可以達到獲取併集的效果,但是呢會直接將結果賦值給x
x = {11,22,33}
ae = {11,44}
temp = x.union(ae)
print(temp)
print('使用union獲取併集之後的x:',x)
temp = x.update(ae)
print(temp)
print('使用update 獲取併集之後,賦值給x:',x)
判斷是 子集 或者 父集合的方法
x = {11,22,33}
ae = {11,44}
y = {11,44,22}
# 判斷是否不存在交集(有交集返回 False、不存在交集返回 True)
temp = x.isdisjoint(y)
print('x和y是否存在交集:',temp)
# 判斷x 是否是 y的子集
temp = x.issubset(y)
print('x是否是y的子集:',temp)
temp = ae.issubset(y)
print('ae是否是y的子集:',temp)
#判斷x是否是y的父集合,也就是x是否包含y的每一個元素
temp = x.issuperset(y)
print('x是否是be的父集合,也就是x是否包含be的每一個元素:',temp)
temp = y.issuperset(ae)
print('be是ae的父集合,包含ae裡面的所有元素:',temp)
a 和 b的併集
a 和 b的交集
a 和 b的差集(元素在a中有,但是不在b中)
a 和 b的對稱差集(a 和 b中都有的元素,然後取反)
a = [11,22,33,55,66]
b = [11,44,66]
# | 是或者,表示既可以是a,也可以是b,就是a和b的併集
s = a | b
print(s)
# & 是並且,表示既要滿足 a ,又要滿足b,成為 a 和 b的交集
s = a & b
print( s )
# - 表示從 a裡面移除 和b有相同的元素,剩下的就是a
s = a - b
print(s)
# ^ 揚抑符 表示取 a + b - a和b的交集
s = a ^ b
print(s)
數據類型轉換
set1 = set(range(1))
#將 set 轉換成 list集合
list1 = list(set1)
#將set 轉換成 tuple
tup = tuple(set1)
#將 set轉換成 字符串
str1= str(set1)
print(list1, type(list1))
print(tup, type(tup))
print(str1, type(str1))