摘要:空集合的長度是和類似于對(duì)列表的操作。把多個(gè)對(duì)象添加到集合中。和這兩個(gè)都是從集合中刪除一個(gè)元素。求兩個(gè)或多個(gè)集合的交集,即把這些集合中共同含有的元素放在一起組合成新的集合并返回。相當(dāng)于集合的減法。集合不能作為字典的,但是卻可以。
Python集合(set),是一個(gè)很有意思的數(shù)據(jù)結(jié)構(gòu)。從形式上看,它像字典有key但沒有value,它的寫法是這樣的s = {"a", "b", "c"},是不是像一個(gè)沒有value的字典?另一方面,它又像是一個(gè)用花括號(hào)替換了方括號(hào)的列表,但它不能像列表那樣用索引訪問元素。
其實(shí),Python集合在內(nèi)部實(shí)現(xiàn)上就是一個(gè)沒有value的字典,所以它跟字典很像。既然和字典很像,那么還要集合干什么?集合主要用來干什么呢?
集合主要用于測(cè)試一個(gè)對(duì)象是不是在一堆對(duì)象集里面,也就是in運(yùn)算。這個(gè)功能其實(shí)列表也可以,比如1 in [2,3,4,5],但是用列表的速度遠(yuǎn)遠(yuǎn)低于集合,尤其是在這一堆對(duì)象的數(shù)量非常大時(shí)。
列表因?yàn)槭琼樞虼鎯?chǔ)的,它的查找時(shí)間復(fù)雜度是O(n),而集合是用hash table實(shí)現(xiàn)的,其時(shí)間復(fù)雜度是O(1)。
Python集合(set)的創(chuàng)建集合可以通過set()來創(chuàng)建一個(gè)空集合,也可以把一個(gè)列表轉(zhuǎn)換為集合。類似字典那樣在花括號(hào)內(nèi)可以放用逗號(hào),隔開的多個(gè)對(duì)象:
In [1]: s = set() In [2]: type(s) Out[2]: set In [3]: set([1,2,3,4,5]) Out[3]: {1, 2, 3, 4, 5} In [4]: set([1,2,3,3,5]) Out[4]: {1, 2, 3, 5} In [5]: s = {"a", "d", "e", "c", "b"} In [6]: s2 = {1, "a", True} In [7]: s = {"a", "a", "a"} In [8]: s Out[8]: {"a"} # 字典里面的元素不能重復(fù)
跟字典的鍵不能是可變對(duì)象一樣,集合里面也不能是列表、集合、字典:
In [9]: s = {"a", [1,2]} ------------------------ TypeError Traceback (most recent call last)Python集合(set)的訪問in ----> 1 s = {"a", [1,2]} TypeError: unhashable type: "list" In [10]: s = {"a", {"a":1}} --------------------------- TypeError Traceback (most recent call last) in ----> 1 s = {"a", {"a":1}} TypeError: unhashable type: "dict"
集合不能像列表那樣通過索引訪問內(nèi)部某一個(gè)元素,只能通過遍歷訪問全部元素,或通過變量名訪問整個(gè)集合:
In [13]: s = {"a", "b", "c"} In [14]: s Out[14]: {"a", "b", "c"} In [15]: for x in s: ...: print(x) ...: a c b集合相關(guān)的內(nèi)置函數(shù)
Python內(nèi)置了一些函數(shù)可以用于操作集合,它們是:
len()
返回集合的長度,即集合包含的元素的個(gè)數(shù)。空集合的長度是0
In [41]: len({"a", "b"}) Out[41]: 2 In [42]: len(set()) Out[42]: 0
any()和all()
類似于對(duì)列表、tuple的操作。
any(): 只要集合有一個(gè)元素為True則返回True;
all(): 只有集合的所有元素都為True才返回True;
In [45]: any({"", 0, False}) Out[45]: False In [46]: all({"", 0, False}) Out[46]: False In [47]: all({"a", 0:, False}) Out[47]: False In [48]: any({"a", 0:, False}) Out[48]: True In [49]: any(set()) Out[49]: False In [50]: all(set()) Out[50]: True
跟空字典一樣,它卻認(rèn)為是所有元素都為True,all(set())返回True。
sorted()
跟操作列表、tuple的效果一樣,它把集合的所有元素進(jìn)行排序
In [51]: sorted({"a", "c", "b"}) Out[51]: ["a", "b", "c"]in 運(yùn)算符
跟列表,元組一樣,in用來檢驗(yàn)一個(gè)對(duì)象是不是在集合中:
In [56]: "a" in {"a", "c", "b"} Out[56]: True In [57]: "3" in {"a", "c", "b"} Out[57]: False In [58]: "3" not in {"a", "c", "b"} Out[58]: True
遍歷集合:
In [59]: for k in {"a", "c", "b"}: ...: print(key) ...: a c b集合的內(nèi)置方法:
(1)add(x)
把對(duì)象x添加到集合中。
In [25]: s = {"a", "b", "c"} In [26]: s.add(1) In [27]: s Out[27]: {1, "a", "b", "c"}
(2)update()
把多個(gè)對(duì)象添加到集合中。
In [28]: s.update([1,2,3]) In [29]: s Out[29]: {1, 2, 3, "a", "b", "c"} In [30]: s.update(["x", "y"], {7,8,0}) In [31]: s Out[31]: {0, 1, 2, 3, 7, 8, "a", "b", "c", "x", "y"}
(3)discard(x) 和 remove(x)
這兩個(gè)都是從集合中刪除一個(gè)元素x。不同的是,如果x不在集合中,discard()會(huì)忽略;而remove()會(huì)拋出KeyError的錯(cuò)誤:
In [32]: s Out[32]: {0, 1, 2, 3, 7, 8, "a", "b", "c", "x", "y"} In [33]: s.discard(0) In [34]: s.remove(1) In [35]: s Out[35]: {2, 3, 7, 8, "a", "b", "c", "x", "y"} In [36]: s.discard("z") In [37]: s.remove("z") ---------------------- KeyError Traceback (most recent call last)in ----> 1 s.remove("z") KeyError: "z"
(4)pop()
類似字典的pop()和列表的pop(),都是從其中刪除一個(gè)元素并返回該元素。因?yàn)榧蠜]有key和索引的概念,所以集合的pop()不帶參數(shù)。
(5)clear()
清空一個(gè)集合
In [40]: s Out[40]: {2, 3, 7, 8, "a", "b", "c", "x", "y"} In [41]: s.clear() In [42]: s Out[42]: set()
(6)copy()
跟字典的copy()一樣,返回一個(gè)集合的深拷貝。
In [44]: s = {"a", "b", "c"} In [45]: s2 = s.copy() In [46]: s2 Out[46]: {"a", "b", "c"} In [47]: s.add(1) In [48]: s Out[48]: {1, "a", "b", "c"} In [49]: s2 Out[49]: {"a", "b", "c"}
(7)union()
求兩個(gè)或多個(gè)集合的并集,即把這些集合的所有元素放在一起組成新的集合并返回。它不改變?cè)瓉淼募稀?/p>
In [51]: s1, s2, s3 = {1,2,3}, {4,5,6}, {6,7,8} In [52]: s1.union(s2) Out[52]: {1, 2, 3, 4, 5, 6} In [53]: s1 Out[53]: {1, 2, 3} In [54]: s1.union(s2, s3) Out[54]: {1, 2, 3, 4, 5, 6, 7, 8}
(8)intersection()
求兩個(gè)或多個(gè)集合的交集,即把這些集合中共同含有的元素放在一起組合成新的集合并返回。同樣它也不改變?cè)瓉淼募稀?/p>
In [55]: s1.intersection(s2) Out[55]: set() In [56]: s2.intersection(s3) Out[56]: {6} In [57]: s1.intersection(s2, s3) Out[57]: set()
(10)difference()
求一個(gè)集合S與另一個(gè)或多個(gè)集合的差集,即把只包含在集合S卻不在做比較的集合中的元素組成新的集合并返回,同樣它也不改變?cè)瓉淼募稀O喈?dāng)于集合的減法。
In [58]: s1.difference(s2) Out[58]: {1, 2, 3} # 返回s1包含卻不在s2中的元素組成的集合: s1 - s2 In [59]: s2.difference(s1) Out[59]: {4, 5, 6} # s2包含,s1不包含: s2 - s1 In [60]: s2.difference(s3) Out[60]: {4, 5} # s2包含,s3不包含: s2 - s3 In [61]: s2.difference(s3, s1) Out[61]: {4, 5} # s2包含,s3,s1都不包含: s2 - s3 - s1
(11)symmetric_difference()
求兩個(gè)集合中除去交集之外的元素集合,即把不同時(shí)包含在兩個(gè)集合中的元素放在一起組成新的集合并返回。
In [63]: s1, s2, s3 Out[63]: ({1, 2, 3}, {4, 5, 6}, {6, 7, 8}) In [64]: s1.symmetric_difference(s2) Out[64]: {1, 2, 3, 4, 5, 6} In [65]: s2.symmetric_difference(s3) Out[65]: {4, 5, 7, 8}
(12) intersection_update()
同intersection()一樣求得新集合,但是本方法改變調(diào)用它的對(duì)象。
In [74]: s1, s2, s3 = {1,2,3}, {4,5,6}, {6,7,8} In [75]: s1.intersection(s2) Out[75]: set() In [76]: s1 Out[76]: {1, 2, 3} In [77]: s1.intersection_update(s2) In [78]: s1 Out[78]: set()
(13)difference_update()
同difference()一樣求得新集合,并用新集合改變調(diào)用該方法的集合。
In [79]: s1, s2, s3 = {1,2,3}, {4,5,6}, {6,7,8} In [80]: s1.difference_update(s2) In [81]: s1 Out[81]: {1, 2, 3}
(14)symmetric_difference_update()
通symmetric_difference()一樣求得新集合,并用新集合改變調(diào)用該方法的集合。
In [83]: s1, s2 = {1,2,3}, {4,5,6} In [84]: s1.symmetric_difference_update(s2) In [85]: s1 Out[85]: {1, 2, 3, 4, 5, 6}
(15)isdisjoint()
如果兩個(gè)集合沒有交集則返回True。
In [87]: s1, s2 = {1,2,3}, {4,5,6} In [88]: s1.isdisjoint(s2) Out[88]: True
(16)issubset()
判斷一個(gè)集合是不是另一個(gè)集合的子集,即它的所有元素都包含在另外一個(gè)集合中。
In [89]: {1,2}.issubset({1,2,3}) Out[89]: True In [90]: {1,2}.issubset({1,2}) Out[90]: True In [91]: {1,2}.issubset({1,5,6}) Out[91]: False
(17)issuperset()
判斷一個(gè)集合是不是另一個(gè)集合的超集,即它包含另外一個(gè)集合的所有元素。
In [93]: {1,2}.issuperset({1,2}) Out[93]: True In [94]: {1,2}.issuperset({1,2,3}) Out[94]: False In [95]: {1,2}.issuperset({1}) Out[95]: Truefrozenset
顧名思義,就是凍住了的集合,即不可改變的集合。集合不能作為字典的key,但是frozenset卻可以。
In [100]: fs1 = frozenset() In [101]: fs1 Out[101]: frozenset() In [102]: fs2 = frozenset([1,2,3]) In [103]: fs2 Out[103]: frozenset({1, 2, 3}) In [104]: {fs2:3} Out[104]: {frozenset({1, 2, 3}): 3}總結(jié)
集合是沒有了value的字典,但它也有自己的個(gè)性。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/43774.html
摘要:布爾值布爾值和布爾代數(shù)的表示完全一致,一個(gè)布爾值只有兩種值的數(shù)據(jù)類型可以通過內(nèi)置的函數(shù)查詢,例如還可以用來判斷和的區(qū)別在于不會(huì)認(rèn)為子類是一種父類類型。會(huì)認(rèn)為子類是一種父類類型。基本功能是進(jìn)行成員關(guān)系測(cè)試和刪除重復(fù)元素。 ...
文章目錄 強(qiáng)烈推薦系列教程,建議學(xué)起來!! 一.pycharm下載安裝二.python下載安裝三.pycharm上配置python四.配置鏡像源讓你下載嗖嗖的快4.1pycharm內(nèi)部配置 4.2手動(dòng)添加鏡像源4.3永久配置鏡像源 五.插件安裝(比如漢化?)5.1自動(dòng)補(bǔ)碼神器第一款5.2漢化pycharm5.3其它插件 六.美女背景七.自定義腳本開頭八、這個(gè)前言一定要看九、pyt...
摘要:易于維護(hù)的成功在于它的源代碼是相當(dāng)容易維護(hù)的。可移植基于其開放源代碼的特性,已經(jīng)被移植也就是使其工作到許多平臺(tái)。集合集合是由一個(gè)或數(shù)個(gè)形態(tài)各異的大小整體組成的,構(gòu)成集合的事物或?qū)ο蠓Q作元素或是成員。基本功能是進(jìn)行成員關(guān)系測(cè)試和刪除重復(fù)元素。 ...
??蘇州程序大白一文從基礎(chǔ)手把手教你Python數(shù)據(jù)可視化大佬??《??記得收藏??》 目錄 ????開講啦!!!!????蘇州程序大白?????博主介紹前言數(shù)據(jù)關(guān)系可視化散點(diǎn)圖 Scatter plots折線圖強(qiáng)調(diào)連續(xù)性 Emphasizing continuity with line plots同時(shí)顯示多了圖表 數(shù)據(jù)種類的可視化 Plotting with categorical da...
閱讀 1170·2021-10-20 13:48
閱讀 2195·2021-09-30 09:47
閱讀 3107·2021-09-28 09:36
閱讀 2348·2019-08-30 15:56
閱讀 1201·2019-08-30 15:52
閱讀 2025·2019-08-30 10:48
閱讀 611·2019-08-29 15:04
閱讀 573·2019-08-29 12:54