定義
set是一個(gè)無(wú)序且不重復(fù)的元素集合嚎花。
集合對(duì)象是一組無(wú)序排列可哈希的值寸痢,集合成員可以做字典中的鍵。集合用in
和not in
操作符檢查成員紊选,以len()
內(nèi)建函數(shù)得到集合的基數(shù)(大刑渲埂)道逗,用for
循環(huán)迭代集合的成員。但是因?yàn)榧媳旧硎菬o(wú)序的献烦,不可以為集合創(chuàng)建索引或執(zhí)行切片(slice)操作滓窍,也沒(méi)有鍵(keys)可用來(lái)獲取集合中元素的值。
set和dict一樣仿荆,只是沒(méi)有value贰您,相當(dāng)于dict的key集合,由于dict的key是不重復(fù)的拢操,且key是不可變對(duì)象因此set也有如下特性:
- 不重復(fù)
- 元素為不可變對(duì)象
創(chuàng)建
方式一
先初始化再賦值
s = set()
s = {11,22,33,44} #注意在創(chuàng)建空集合的時(shí)候只能使用s=set()锦亦,因?yàn)閟={}創(chuàng)建的是空字典
方式二
直接創(chuàng)建
a=set('boy')
d={'k1','k2','k2'}
方式三
利用list創(chuàng)建
b=set(['y', 'b', 'o','o'])
方式四
利用dict創(chuàng)建,將會(huì)使用dict中的key值作為set的值
Input:
c=set({"k1":'v1','k2':'v2'})
c
Output:
{'k1', 'k2'}
方式五
使用tuple創(chuàng)建
e={('k1', 'k2','k2')}
更新(增加)
update
Input:
se = {11, 22, 33}
be = {22,44,55}
se.update(be) # 把se和be合并令境,得出的值覆蓋se
print(se)
se.update([66, 77]) # 可增加迭代項(xiàng)
print(se)
Output:
{33, 22, 55, 11, 44}
{33, 66, 22, 55, 11, 44, 77}
刪除
discard()
杠园、remove()
、pop()
Input:
se = {11, 22, 33}
se.discard(11)
se.discard(44) # 移除不存的元素不會(huì)報(bào)錯(cuò)
print(se)
Output:
{33, 22}
Input:
se = {11, 22, 33}
se.remove(11)
se.remove(44) # 移除不存的元素會(huì)報(bào)錯(cuò)
print(se)
Output:
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-15-7256c38824cb> in <module>()
1 se = {11, 22, 33}
2 se.remove(11)
----> 3 se.remove(44) # 移除不存的元素會(huì)報(bào)錯(cuò)
4 print(se)
KeyError: 44
集合操作
交集
intersection
, intersection_update
舔庶,也可以使用a&b
Input:
temp1 = se.intersection(be) #取交集抛蚁,賦給新值
print(temp1) # 22
print(se) # {11, 22, 33}
temp2 = se.intersection_update(be) #取交集并更新自己
print(temp2) # None
print(se) # 22
print(se&be)
Output:
{22}
{22}
None
{22}
{22}
并集
union
,也可以使用a|b
Input:
se = {11, 22, 33}
be = {22,44,55}
temp=se.union(be) #取并集惕橙,并賦新值
print(se) #{33, 11, 22}
print(temp) #{33, 22, 55, 11, 44}
print(se|be)
Output:
{33, 11, 22}
{33, 22, 55, 11, 44}
{33, 22, 55, 11, 44}
差集
difference
, difference_update
瞧甩,也可以使用a-b
Input:
se = {11, 22, 33}
be = {22, 55}
temp1 = se.difference(be) #找到se中存在,be中不存在的集合弥鹦,返回新值
print(temp1) #{33, 11}
print(se-be)
print(se) #{33, 11, 22}
Output:
{33, 11}
{33, 11}
{33, 11, 22}
Input:
temp2 = se.difference_update(be) #找到se中存在肚逸,be中不存在的集合,覆蓋掉se
print(temp2) #None
print(se) #{33, 11}
Output:
None
{33, 11}
Input:
se = {11, 22, 33} # 移除末尾元素并把移除的元素賦給新值
temp = se.pop()
print(temp) # 33
print(se) # {11, 22}
Output:
33
{11, 22}
包含關(guān)系
兩個(gè)集合之間一般有三種關(guān)系彬坏,相交朦促、包含、不相交栓始。在Python中分別用下面的方法判斷:
-
set.isdisjoint(s)
:判斷兩個(gè)集合是不是不相交 -
set.issuperset(s)
:判斷集合是不是包含其他集合务冕,等同于a>=b
-
set.issubset(s)
:判斷集合是不是被其他集合包含,等同于a<=b
如果要真包含關(guān)系幻赚,就用符號(hào)操作>
和<
Input:
se = {11, 22, 33}
be = {22}
print(se.isdisjoint(be)) #False禀忆,判斷是否不存在交集(有交集False,無(wú)交集True)
print(se.issubset(be)) #False坯屿,判斷se是否是be的子集合
print(se <= be)
print(se.issuperset(be)) #True油湖,判斷se是否是be的父集合
print(se >= be)
Output:
False
False
False
True
True
合并
symmetric_difference
, symmetric_difference_update
Input:
se = {11, 22, 33}
be = {22}
temp1 = se.symmetric_difference(be) # 合并不同項(xiàng),并賦新值
print(temp1) #{33, 11}
print(se) #{33, 11, 22}
temp2 = se.symmetric_difference_update(be) # 合并不同項(xiàng)领跛,并更新自己
print(temp2) #None
print(se) #{33, 11}
Output:
{33, 11}
{33, 11, 22}
None
{33, 11}
集合的轉(zhuǎn)換
集合可以轉(zhuǎn)換為list乏德,tuple以及str
Input:
se = set(range(4))
li = list(se)
tu = tuple(se)
st = str(se)
print(li,type(li))
print(tu,type(tu))
print(st,type(st))
Output:
[0, 1, 2, 3] <class 'list'>
(0, 1, 2, 3) <class 'tuple'>
{0, 1, 2, 3} <class 'str'>
不變集合
Python提供了不能改變?cè)氐募系膶?shí)現(xiàn)版本,即不能增加或刪除元素,類型名叫frozenset喊括,使用方法如下
Input:
a = frozenset("hello")
a
Output:
frozenset({'e', 'h', 'l', 'o'})
需要注意的是frozenset仍然可以進(jìn)行集合操作胧瓜,只是不能用帶有update的方法。如果要一個(gè)有frozenset中的所有元素的普通集合郑什,只需把它當(dāng)作參數(shù)傳入集合的構(gòu)造函數(shù)中即可:
Input:
a = frozenset("hello")
a = set(a)
a.add(12)
a
Output:
{12, 'e', 'h', 'l', 'o'}
參考文章
每天學(xué)點(diǎn)Python之set - CSDN博客
Python基本數(shù)據(jù)類型之set - morra - 博客園