python3 集合运算_Python 集合与集合运算
了解 Python 集合: 它們是什么,如何創(chuàng)建它們,何時(shí)使用它們,什么是內(nèi)置函數(shù),以及它們與集合論操作的關(guān)系
集合、 列表與元組
列表(list)和元組(tuple)是標(biāo)準(zhǔn)的 Python 數(shù)據(jù)類型,它們將值存儲(chǔ)在一個(gè)序列中。集合(set)是另一種標(biāo)準(zhǔn)的 Python 數(shù)據(jù)類型,它也可用于存儲(chǔ)值。它們之間主要的區(qū)別在于,集合不同于列表或元組,集合中的每一個(gè)元素不能出現(xiàn)多次,并且是無(wú)序存儲(chǔ)的。
Python 集合的優(yōu)勢(shì)
由于集合中的元素不能出現(xiàn)多次,這使得集合在很大程度上能夠高效地從列表或元組中刪除重復(fù)值,并執(zhí)行取并集、交集等常見(jiàn)的的數(shù)學(xué)操作。
本教程將向你介紹一些關(guān)于 Python 集合和集合論的話題:
如何初始化空集和帶有數(shù)值的集合
如何向集合中添加值或者從集合中刪除值
如何高效地使用集合,用于成員檢測(cè)、從列表中刪除重復(fù)值等任務(wù)。
如何執(zhí)行常見(jiàn)的集合操作,例如求并集、交集、差集以及對(duì)稱差。
可變集合和不可變集之間的區(qū)別
集合初始化
集合是一個(gè)擁有確定(唯一)的、不變的的元素,且元素?zé)o序的可變的數(shù)據(jù)組織形式。
你可以使用「set()」操作初始化一個(gè)空集。
如果你觀察一下上面的「dataScientist」和「dataEngineer」集合中的變量,就會(huì)發(fā)現(xiàn)集合中元素值的順序與添加時(shí)的順序是不同的,這是因?yàn)榧鲜菬o(wú)序的。
集合包含的值也可以通過(guò)花括號(hào)來(lái)初始化。
請(qǐng)牢記,花括號(hào)只能用于初始化包含值的集合。如下圖所示,使用不包含值的花括號(hào)是初始化字典(dict)的方法之一,而不是初始化集合的方法。
向集合添加值或刪除值
你可以使用「add」方法向集合中添加一個(gè)值。
從集合中刪除值
有好幾種方法可以從集合中刪除一個(gè)值:
選項(xiàng) 1:你可以使用「remove」方法從集合中刪除一個(gè)值。
選項(xiàng) 2:你可以使用「discard」方法,從集合中刪除一個(gè)值。
這種方法相對(duì)于「remove」方法的好處是,如果你試圖刪除一個(gè)集合中不存在的值,系統(tǒng)不會(huì)返回「KeyError」。如果你熟悉字典(dict)數(shù)據(jù)結(jié)構(gòu),你可能會(huì)發(fā)現(xiàn)這種方法與字典的「get」方法的工作模式相似。
選項(xiàng) 3:你還可以使用「pop」方法從集合中刪除并且返回一個(gè)任意的值。
需要注意的是,如果集合是空的,該方法會(huì)返回一個(gè)「KeyError」。
刪除集合中所有的值
你可以使用「clear」方法刪除集合中所有的值。
graphicDesigner.clear()
在集合上進(jìn)行迭代
與許多標(biāo)準(zhǔn) Python 數(shù)據(jù)類型一樣,用戶可以在集合(set)上進(jìn)行迭代。
如果你仔細(xì)觀察「dataScientist」集合中打印出來(lái)的每一個(gè)值,你會(huì)發(fā)現(xiàn)集合中的值被打印出來(lái)的順序與它們被添加的順序是不同的。
將集合中的值變?yōu)橛行?/p>
本教程已經(jīng)向大家強(qiáng)調(diào)了集合是無(wú)序的。如果你認(rèn)為你需要以有序的形式從集合中取出值,你可以使用「sorted」函數(shù),它會(huì)輸出一個(gè)有序的列表。
type(sorted(dataScientist))
下面的代碼按照字母降序(這里指 Z-A)輸出「dataScientist」集合中的值。
sorted(dataScientist, reverse = True)
刪除列表中的重復(fù)項(xiàng)
首先我們必須強(qiáng)調(diào)的是,集合是從列表(list)中刪除重復(fù)值的最快的方法。為了證明這一點(diǎn),讓我們研究以下兩種方法之間的差異。
方法 1:使用集合刪除列表中的重復(fù)值。
print(list(set([1, 2, 3, 1, 7])))
方法 2:使用一個(gè)列表推導(dǎo)式(list comprehension)從一個(gè)列表中刪除重復(fù)值。
性能的差異可以用「timeit」庫(kù)來(lái)測(cè)量,這個(gè)庫(kù)允許你對(duì) Python 代碼進(jìn)行計(jì)時(shí)。下面的代碼將每種方法運(yùn)行了 10,000 次,并且以秒為單位輸出了總計(jì)時(shí)間。
對(duì)比這兩種方法,結(jié)果表明,使用集合刪除重復(fù)值是更加高效的。雖然時(shí)間差異看似很小,但實(shí)際上在有一個(gè)非常大的列表時(shí),能幫你節(jié)省很多的時(shí)間。
集合運(yùn)算方法
Python 中常用的集合方法是執(zhí)行標(biāo)準(zhǔn)的數(shù)學(xué)運(yùn)算,例如:求并集、交集、差集以及對(duì)稱差。下圖顯示了一些在集合 A 和集合 B 上進(jìn)行的標(biāo)準(zhǔn)數(shù)學(xué)運(yùn)算。每個(gè)韋恩(Venn)圖中的紅色部分是給定集合運(yùn)算得到的結(jié)果。
Python 集合有一些讓你能夠執(zhí)行這些數(shù)學(xué)運(yùn)算的方法,還有一些給你等價(jià)結(jié)果的運(yùn)算符。在研究這些方法之前,讓我們首先初始化「dataScientist」和「dataEngineer」這兩個(gè)集合。
并集
一個(gè)表示為「dataScientist ∪ dataEngineer」的并集,是屬于「dataScientist」或「dataEngineer」或同時(shí)屬于二者元素的集合。你可以使用「union」方法找出兩個(gè)集合中所有唯一的值。
交集
集合「dataScientist」和「dataEngineer」的交集可以表示為「dataScientist ∩ dataEngineer」,是所有同時(shí)屬于兩個(gè)集合的元素集合。
差集
集合「dataScientist」和「dataEngineer」的差集可以表示為「dataScientist \ dataEngineer」,是所有屬于「dataScientist」但不屬于「dataEngineer」的元素集合。
對(duì)稱集
一個(gè)「dataScientist」和「dataEngineer」的對(duì)稱集,表示為「dataScientist △ dataEngineer」,它是所有屬于兩個(gè)集合但不屬于二者共有部分的集合。
集合推導(dǎo)式
你之前可能已經(jīng)學(xué)習(xí)過(guò)列表推導(dǎo)式(list comprehensions)、字典推導(dǎo)式(dictionary comprehensions)和生成器推導(dǎo)式。這里還有一個(gè)集合推導(dǎo)式(Set Comprehension)。集合推導(dǎo)式和它們是很類似的,Python 中的集合推導(dǎo)式可以按照下面的方法構(gòu)造:
不可變集
嵌套集合的問(wèn)題在于,集合中通常不能包含集合等可變的值。在這種情況下,你可能希望使用一個(gè)不可變集(frozenset)。除了值不可以改變,不可變集和可變集是很相似的。你可以使用「frozenset()」創(chuàng)建一個(gè)不可變集。
如果你使用如下所示的不可變集,就可以創(chuàng)建一個(gè)嵌套集合了。
重要的是,你需要記住,不可變集的一個(gè)主要的缺點(diǎn)是:由于它們是不可變的,這意味著你不能向其中添加元素或者刪除其中的元素。
結(jié)語(yǔ)
Python 集合是非常實(shí)用的,它能夠高效地從列表等數(shù)據(jù)結(jié)構(gòu)中刪除重復(fù)的值,并且執(zhí)行常見(jiàn)的數(shù)學(xué)運(yùn)算,例如:求并集、交集。人們經(jīng)常遇到的一個(gè)挑戰(zhàn)是:何時(shí)使用各種數(shù)據(jù)類型,例如什么時(shí)候使用集合或字典。作者希望本文能展示基本的集合概念,并有利于我們?cè)诓煌蝿?wù)中使用不同的數(shù)據(jù)類型。
本文同步分享在 博客“考古學(xué)家lx”(CSDN)。
如有侵權(quán),請(qǐng)聯(lián)系 support@oschina.cn 刪除。
本文參與“OSC源創(chuàng)計(jì)劃”,歡迎正在閱讀的你也加入,一起分享。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的python3 集合运算_Python 集合与集合运算的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: dio拦截器 flutter_详解flu
- 下一篇: Python笔记-Json转DataFr