Python內(nèi)置數(shù)據(jù)類型中的集合詳解
1. 集合 set 簡(jiǎn)介
集合的最大特征是其每個(gè)元素都是唯一的,它可以刪除、可以增加、也可以通過(guò)增刪實(shí)現(xiàn)替換元素,但是它是沒(méi)有下標(biāo)的,你無(wú)法通過(guò)下標(biāo)或者切片功能訪問(wèn)集合。因?yàn)榧暇拖褚粋€(gè)袋子里面裝著顏色不一樣的玻璃球,你可以替換玻璃球,但是無(wú)法指定玻璃球存放的地點(diǎn)。
它最大的作用,就是它元素的唯一,它經(jīng)常被用來(lái)清除多余的數(shù)據(jù)。
1.1 使用 { } 直接創(chuàng)建集合
可以使用 {} 直接創(chuàng)建集合,但是不能使用 {} 創(chuàng)建空集合,因?yàn)?{} 被用來(lái)創(chuàng)建空字典。你只能通過(guò) set() 來(lái)創(chuàng)建空集合。
1.2 使用 set() 函數(shù)創(chuàng)建集合
使用內(nèi)置函數(shù) set,可以快速的將其他類型的可迭代對(duì)象轉(zhuǎn)換成 集合 對(duì)象。這些可迭代對(duì)象,可以是字符串、列表、元組等等。
print("創(chuàng)建一個(gè)空集合") print(set()) str1 = 'ABCDEF!' s=set(str1) print("*"*40) print("一個(gè)由字符串轉(zhuǎn)換的集合,每個(gè)元素即唯一的單獨(dú)字符") print(s) list1 = [0,1,2,3,4,3,2,1] s=set(list1) print("*"*40) print("一個(gè)由列表轉(zhuǎn)換的集合,但是在列表中重復(fù)的元素只會(huì)出現(xiàn)一次") print(s)
2. 集合沒(méi)有切片功能!
請(qǐng)仔細(xì)理解,集合沒(méi)有切片功能,這意味著什么,這意味著無(wú)法對(duì)它排序(當(dāng)然可以轉(zhuǎn)換成列表再排序),意味著無(wú)法用 while 循環(huán)配合下標(biāo)依次獲得元素,你可以用 for 循環(huán)獲取。
3. 處理集合的常見(jiàn)內(nèi)置函數(shù)
3.1 len 函數(shù)
len 函數(shù)返回集合的長(zhǎng)度,即元素的個(gè)數(shù)。
3.2 map 函數(shù)
map 函數(shù)對(duì)集合中的每個(gè)元素進(jìn)行相同的操作,然后返回一個(gè) map 對(duì)象,再使用 set 函數(shù)可以得到集合。
>>> a {'sdf', 'er'} >>> set(map(lambda x:x+"-",a)) {'er-', 'sdf-'}
3.3 filter 函數(shù)
filter 函數(shù)對(duì)集合中的每個(gè)元素進(jìn)行相同的操作,符合條件的元素才留下來(lái),返回一個(gè) filter 類型的對(duì)象。
>>> a {'sdf', 'er'} >>> set(filter(lambda x:len(x)==2,a)) {'er'}
3.4 reduce 函數(shù)
filter 函數(shù)依次對(duì)集合中的元素進(jìn)行相同的迭代操作最后得到一個(gè)對(duì)象。
>>> import functools >>> a {'sdf', 'er'} >>> functools.reduce(lambda x,y:x+"~"+y,a) 'sdf~er'
3.5 sum 函數(shù)
sum 函數(shù),只對(duì)元素是數(shù)值的集合有效,返回列表中的元素總和,如果元素類型不是數(shù)值,則返回 TypeError。
3.6 max 函數(shù)
max 函數(shù),返回集合中的元素最大值。
3.7 min 函數(shù)
min 函數(shù),返回集合中的元素最小值。
>>> a={1,2,3} >>> sum(a) 6 >>> min(a) 1 >>> max(a) 3 >>>
3.8 sorted 函數(shù)
sorted 函數(shù)會(huì)對(duì)集合按照指定方式進(jìn)行排序,請(qǐng)注意,使用 sorted 函數(shù)會(huì)得到一個(gè)排好序的列表,不是集合?。?!原集合不會(huì)改變。
list1 = [0,1,2,3,4,3,2,1] s=set(list1) s1=sorted(s) print(s1) print(type(s1))
3.9 enumerate 函數(shù)
enumerate 函數(shù)可以將一個(gè)集合依次取出。
3.10 any 函數(shù)
any() 函數(shù)用于判斷給定的集合的所有元素是否都為 False,則返回 False,如果有一個(gè)為 True,則返回 True。
3.11 all 函數(shù)
all() 函數(shù)用于判斷給定的集合的所有元素是否都為 TRUE,如果是返回 True,否則返回 False。
4. 集合的內(nèi)置方法
4.1 .add(val)
.add(val) 方法附加一個(gè)元素 val,如果 val 已經(jīng)在集合中,那么原來(lái)的集合不變化。
4.2 .clear()
.clear() 方法將集合清空。
4.3 .copy()
.copy() 方法將返回集合的拷貝(而不是和原來(lái)的列表共用同一個(gè)地址)。
4.4 .difference(set1,set2,...)
difference() 方法用于返回集合的差集,即返回的集合元素包含在第一個(gè)集合中,但不包含在第二、三、N個(gè)集合(方法的參數(shù))中。
4.5 .difference_update(set1,set2,...)
difference_update() 方法用于移除兩個(gè)或者多個(gè)集合中都存在的元素。
difference_update() 方法與 difference() 方法的區(qū)別在于 difference() 方法返回一個(gè)移除相同元素的新集合,而 difference_update() 方法是直接在原來(lái)的集合中移除元素,沒(méi)有返回值。
# 集合的使用 a={1,2,3,4,1} b={4,5,6,7} # 1.集合是不會(huì)有重復(fù)的元素的 print("1. ",a) # 2.集合使用 add 方法加一個(gè)元素 a.add("6") print("2. ",a) # 3.集合使用 clear 方法清空 a.clear() print("3. ",a) a={1,2,3,4} # 4.集合使用 copy 方法復(fù)制數(shù)據(jù) c=a.copy() print("4. ",c) # 5.集合使用 difference 方法返回 # 和其他集合不一樣的數(shù)據(jù) print("5. ",a.difference(b)) # 6.集合使用 difference_update 方法刪除 # 和其他集合一樣的數(shù)據(jù) # a={1,2,3,4} # b={4,5,6,7} a={1,2,3,4} b={4,5,6,7} print("6. ",a.difference_update(b)) print("6. ",a) a={1,2,3,4} c={1} a.difference_update(b,c) print("6. ",a) # 7.集合使用 discard 方法刪掉數(shù)據(jù) val a={1,2,3,4} a.discard(2) print("7. ",a)
4.6 .discard(val)
.discard 方法刪除集合中指定的元素。
4.7 .intersection(set1,set2,...)
.intersection 方法返回集合的交集,自身不受影響。
4.8 .intersection_update()
.intersection 方法原地改變自身為兩個(gè)或者多個(gè)集合的交集。
>>> a={1,2,3,4,5} >>> b={2,3,4,5,6,7} >>> a.intersection(b) {2, 3, 4, 5} >>> a {1, 2, 3, 4, 5} >>> b {2, 3, 4, 5, 6, 7} >>> a.intersection_update(b) >>> a {2, 3, 4, 5} >>> b {2, 3, 4, 5, 6, 7}
4.9 .isdisjoint()
.isdisjoint 方法判斷兩個(gè)集合是否包含相同的元素,如果沒(méi)有返回 True,否則返回 False。
>>> a={1,2,3,4,5} >>> b={2,3,4,5,6,7} >>> c={"a","b"} >>> a.isdisjoint(b) False >>> a.isdisjoint(c) True
4.10 .issubset(other_set)
.issubset 方法判斷自身集合是否為該方法參數(shù)集合 other_set 的子集。
>>> a={1,2,3,4,5} >>> b={2,3,4,5,6,7} >>> c={1} >>> a.issubset(b) False >>> a.issubset(c) False >>> c.issubset(a) True
4.11 .issuperset(other_set)
.issuperset 方法判斷該方法參數(shù)集合 other_set 是否為自身集合的子集。
>>> a={1,2,3,4,5} >>> b={2,3,4,5,6,7} >>> c={1} >>> a.issuperset(b) False >>> a.issuperset(c) True
4.12 .pop()
.pop() 方法將返回集合中的一個(gè)元素,原集合將刪除該元素。
請(qǐng)注意,集合中的 pop 方法是沒(méi)有 index 參數(shù)!如果像使用列表中的 pop 方法輸入 index 參數(shù),則返回 TypeError: pop() takes no arguments (1 given) 錯(cuò)誤。
4.13 .remove()
.remove(val) 方法將刪除集合中的 val 元素,返回為空。如果 val 不在集合中,則返回 KeyError 錯(cuò)誤。
4.14 .symmetric_difference()
返回兩個(gè)集合中不重復(fù)的元素集合,而不改變自身集合。
4.15 .symmetric_difference_update()
移除當(dāng)前集合中在另外一個(gè)指定集合相同的元素,并將另外一個(gè)指定集合中不同的元素插入到當(dāng)前集合中。
# 10.集合使用 ^ 操作符返回 # 兩個(gè)集合中不一樣的數(shù)據(jù) # 等同于 symmetric_difference方法 a={1,2,3,4} b={4,5,6,7} tmp=a^b print("10. ",tmp) print("a==>",a) print("b==>",b) print("使用 ^ 操作符 原來(lái)的集合不受影響") print("*"*60) print("a.symmetric_difference(b)==>",a.symmetric_difference(b)) print("a==>",a) print("b==>",b) print("使用 symmetric_difference方法 原來(lái)的集合不受影響") print("*"*60) print("a.symmetric_difference_update(b)==>",a.symmetric_difference_update(b)) print("使用 symmetric_difference_update 原來(lái)的集合會(huì)改變") print("a==>",a) print("b==>",b) print("*"*60)
4.16 .union(other_set)
.union 方法返回兩個(gè)集合的并集,而不改變自身集合。
4.17 .update(other_set)
.update 方法給自身集合集合添加元素。
>>> a={0,1} >>> b={3,4} >>> c={5,6} >>> a.union(b) {0, 1, 3, 4} >>> a {0, 1} >>> b {3, 4} >>> a.update(b) >>> a {0, 1, 3, 4} >>> b {3, 4}
5. 集合和運(yùn)算符
5.1 - 運(yùn)算符
a 、b 是兩個(gè)集合;a - b類似于 a.difference(b) 方法,即返回集合a中包含而集合b中不包含的元素,自身不受改變。
>>> a={0,1,2,3} >>> b={2,3,4,5} >>> a-b {0, 1} >>> a.difference(b) {0, 1}
5.2 | 運(yùn)算符
a 、b 是兩個(gè)集合;a | b類似于 a.union(b) 方法,即返回集合a和b中所有的元素,自身不受改變。
>>> a={0,1,2,3} >>> b={2,3,4,5} >>> a|b {0, 1, 2, 3, 4, 5} >>> a.union(b) {0, 1, 2, 3, 4, 5}
5.3 & 運(yùn)算符
a 、b 是兩個(gè)集合;a & b類似于 a.intersection(b) 方法,即返回集合a和b中都包含了的元素,自身不受改變。
# 9.集合使用 & 選出集合重疊的部分 # 等同于 insection 方法 a={1,2,3,4} b={4,5,6,7} print("********* 初始數(shù)據(jù) ***********") print("a==>",a) print("b==>",b) print("8. a & b==>",a & b) print("執(zhí)行 a & b 后") print("a==>",a) print("b==>",b) print("使用 & 操作符 原來(lái)的集合不受影響") print("*"*60) print("8. a.intersection(b)==>",a.intersection(b)) print("使用 intersection 方法 原來(lái)的集合不受影響") print("a==>",a) print("b==>",b) print("*"*60) print("8. a.intersection_update(b)==>",a.intersection_update(b)) print("使用 intersection_update 方法 原來(lái)的集合會(huì)改變") print("a==>",a) print("b==>",b) print("*"*60)
5.4 ^ 運(yùn)算符
a 、b 是兩個(gè)集合;a ^ b類似于 a.symmetric_difference(b) 方法,即返回不同時(shí)包含于a和b的元素,自身不受改變。
>>> a={0,1,2,3} >>> b={2,3,4,5} >>> a.symmetric_difference(b) {0, 1, 4, 5} >>> a^b {0, 1, 4, 5}
5.5 in 、not in 運(yùn)算符
in 運(yùn)算符判斷某個(gè)元素屬于某個(gè)集合
not in 運(yùn)算符判斷某個(gè)元素不屬于某個(gè)集合
>>> a={0,1,2,3} >>> 0 in a True >>> "0" in a False
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
- Python中內(nèi)置數(shù)據(jù)類型list,tuple,dict,set的區(qū)別和用法
- Python內(nèi)置數(shù)據(jù)類型詳解
- python基礎(chǔ)教程之基本內(nèi)置數(shù)據(jù)類型介紹
- Python語(yǔ)言內(nèi)置數(shù)據(jù)類型
- python內(nèi)置數(shù)據(jù)類型之列表操作
- python入門課程第四講之內(nèi)置數(shù)據(jù)類型有哪些
- Python內(nèi)置數(shù)據(jù)類型list各方法的性能測(cè)試過(guò)程解析
- Python的內(nèi)置數(shù)據(jù)類型中的數(shù)字
- python內(nèi)置數(shù)據(jù)類型使用方法和繼承關(guān)系
- 探索Python內(nèi)置數(shù)據(jù)類型的精髓與應(yīng)用
相關(guān)文章
Python爬蟲的兩套解析方法和四種爬蟲實(shí)現(xiàn)過(guò)程
本文想針對(duì)某一網(wǎng)頁(yè)對(duì) python 基礎(chǔ)爬蟲的兩大解析庫(kù)( BeautifulSoup 和 lxml )和幾種信息提取實(shí)現(xiàn)方法進(jìn)行分析,及同一網(wǎng)頁(yè)爬蟲的四種實(shí)現(xiàn)方式,需要的朋友參考下吧2018-07-07詳解tf.device()指定tensorflow運(yùn)行的GPU或CPU設(shè)備實(shí)現(xiàn)
這篇文章主要介紹了詳解tf.device()指定tensorflow運(yùn)行的GPU或CPU設(shè)備實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02Django分頁(yè)查詢并返回jsons數(shù)據(jù)(中文亂碼解決方法)
這篇文章主要介紹了Django分頁(yè)查詢并返回jsons數(shù)據(jù)(中文亂碼解決方法),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08Python實(shí)現(xiàn)分割文件及合并文件的方法
這篇文章主要介紹了Python實(shí)現(xiàn)分割文件及合并文件的方法,涉及Python針對(duì)文件的分割與合并操作相關(guān)技巧,通過(guò)自定義函數(shù)split與join實(shí)現(xiàn)了文件的分割與合并操作,需要的朋友可以參考下2015-07-07python進(jìn)行OpenCV實(shí)戰(zhàn)之畫圖(直線、矩形、圓形)
這篇文章主要為大家詳細(xì)介紹了python進(jìn)行OpenCV實(shí)戰(zhàn)之畫圖功能,畫出直線、矩形、圓形,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08