Python集合(Set)常用操作

定義

set是一個(gè)無(wú)序且不重復(fù)的元素集合嚎花。
集合對(duì)象是一組無(wú)序排列可哈希的值寸痢,集合成員可以做字典中的鍵。集合用innot 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也有如下特性:

  1. 不重復(fù)
  2. 元素為不可變對(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 - 博客園

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末府喳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蘑拯,更是在濱河造成了極大的恐慌钝满,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件申窘,死亡現(xiàn)場(chǎng)離奇詭異弯蚜,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)剃法,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門碎捺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人贷洲,你說(shuō)我怎么就攤上這事收厨。” “怎么了优构?”我有些...
    開(kāi)封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵诵叁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我钦椭,道長(zhǎng)黎休,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任玉凯,我火速辦了婚禮,結(jié)果婚禮上联贩,老公的妹妹穿的比我還像新娘漫仆。我一直安慰自己,他們只是感情好泪幌,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布盲厌。 她就那樣靜靜地躺著,像睡著了一般祸泪。 火紅的嫁衣襯著肌膚如雪吗浩。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天没隘,我揣著相機(jī)與錄音懂扼,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛阀湿,可吹牛的內(nèi)容都是我干的赶熟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼陷嘴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼映砖!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起灾挨,我...
    開(kāi)封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤邑退,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后劳澄,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體地技,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年浴骂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了乓土。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡溯警,死狀恐怖趣苏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情梯轻,我是刑警寧澤食磕,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站喳挑,受9級(jí)特大地震影響彬伦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜伊诵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一单绑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧曹宴,春花似錦搂橙、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至版扩,卻和暖如春废离,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背礁芦。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工蜻韭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓湘捎,卻偏偏與公主長(zhǎng)得像诀豁,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子窥妇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理舷胜,服務(wù)發(fā)現(xiàn),斷路器活翩,智...
    卡卡羅2017閱讀 134,704評(píng)論 18 139
  • //Clojure入門教程: Clojure – Functional Programming for the J...
    葡萄喃喃囈語(yǔ)閱讀 3,682評(píng)論 0 7
  • 本節(jié)要介紹的是Python里面常用的幾種數(shù)據(jù)結(jié)構(gòu)峦树。通常情況下,聲明一個(gè)變量只保存一個(gè)值是遠(yuǎn)遠(yuǎn)不夠的旦事,我們需要將一組...
    小黑y99閱讀 65,200評(píng)論 0 9
  • 1魁巩、MRD(Market Requirement Document)概述 市場(chǎng)需求文檔的主要功能是描述什么樣的功能...
    林木Join閱讀 784評(píng)論 1 3
  • 人生就像是一場(chǎng)征程,只要活著就要不斷的向前奔姐浮!我很羨慕也很佩服那些能放棄朝九晚五高薪工作谷遂,甘愿為了自由“游離”于我...
    魚(yú)在水中閱讀 253評(píng)論 0 0