Python 集合之set詳解
引言
set(集合)雖然用的很少,但它是一個(gè)無(wú)序的不重復(fù)元素序列,用來(lái)簡(jiǎn)單的去重挺快的。
集合的定義
set(集合) 與列表類似,不同之處在于集合的 元素不重復(fù)
集合和字典一樣也是用 {} 定義,但元素之間使用 , 分隔,或者使用 set()
{ } 定義
#!/usr/bin/python3 # -*- coding:utf-8 -*- name_set = {'hui', 'wang', 'zack', 'hui'} print(name_set) # 結(jié)果為 {'hui', 'wang', 'zack'} name_set = set('hui', 'wang', 'zack', 'hui')
set() 定義
set() 只接受一個(gè)參數(shù)
In [13]: name_set = set('hui') In [14]: name_set Out[14]: {'h', 'i', 'u'} In [15]: name_set = set(['hui', 'wang', 'zack', 'hui']) In [16]: name_set Out[16]: {'hui', 'wang', 'zack'}
注意:空集合不能用 s = {} 來(lái)定義這樣默認(rèn)是字典,應(yīng)該 s = set()
In [27]: s = {} In [28]: s1 = set() In [29]: type(s) Out[29]: dict In [30]: type(s1) Out[30]: set
集合常用操作
集合所有內(nèi)置方法如下:
方法太多我選幾個(gè)常用的測(cè)試一下。
集合添加元素
使用 add() 即可向集合中添加元素
In [33]: s = set() In [34]: s.add(1) In [35]: s.add(4) In [36]: s.add(3) In [37]: s Out[37]: {1, 3, 4} In [38]: s.add(2) In [39]: s Out[39]: {1, 2, 3, 4}
集合移除元素
remove()
移除集合中的元素,且如果元素不存在,會(huì)報(bào)錯(cuò)discard()
移除集合中的元素,且如果元素不存在,不會(huì)發(fā)生錯(cuò)誤pop()
隨機(jī)移除集合內(nèi)的一個(gè)元素
In [38]: # remove() 移除 In [39]: s Out[39]: {1, 2, 3, 4} In [40]: s.remove(3) In [41]: s Out[41]: {1, 2, 4} In [42]: s.remove(5) --------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-42-9ec04578636f> in <module> ----> 1 s.remove(5) KeyError: 5
In [45]: # discard() 移除 In [46]: s Out[46]: {1, 2, 4} In [47]: s.discard(4) In [48]: s Out[48]: {1, 2} In [49]: s.discard(3) In [50]: s Out[50]: {1, 2}
In [56]: # pop() 隨機(jī)移除 In [57]: s.pop() Out[57]: 1 In [58]: s Out[58]: {2, 3, 9, 'hui'} In [59]: s.pop() Out[59]: 2 In [60]: s Out[60]: {3, 9, 'hui'}
其實(shí)set 集合的 pop方法會(huì)將集合的左邊第一個(gè)元素進(jìn)行刪除,并返回刪除的元素。
集合統(tǒng)計(jì)、清空元素
- len() 統(tǒng)計(jì)集合元素個(gè)數(shù)
- clear() 清空集合
In [68]: name_set Out[68]: {'wang', 'zack'} In [69]: len(name_set) Out[69]: 2 In [71]: name_set.clear() In [72]: len(name_set) Out[72]: 0 In [73]: name_set Out[73]: set()
集合元素獲取(遍歷)
集合不支持索引,也沒(méi)有方法進(jìn)行獲取,因此只能采用 for ... in ... 遍歷方式獲取元素。
In [81]: name_set Out[81]: {'hui', 'wang', 'zack'} In [82]: for name in name_set: ...: print(name) ...: hui wang zack In [83]: name_set[0] --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-83-c0ead6d21f1d> in <module> ----> 1 name_set[0] TypeError: 'set' object is not subscriptable
集合之間的運(yùn)算
集合差運(yùn)算 -
In [89]: a = {1, 2, 3, 4, 5} In [90]: b = {1, 2, 3, 6} In [91]: a - b Out[91]: {4, 5} In [92]: b - a Out[92]: {6} In [93]: a.difference(b) Out[93]: {4, 5} In [94]: b.difference(a) Out[94]: {6}
a - b 就相當(dāng)于在 a 中去除跟 b 相同的元素b - a 也就是在 b 中去除跟 a 相同的元素a - b 等同于 a.difference(b)
集合并運(yùn)算 |
In [95]: a Out[95]: {1, 2, 3, 4, 5} In [96]: b Out[96]: {1, 2, 3, 6} In [97]: a | b Out[97]: {1, 2, 3, 4, 5, 6}
集合交運(yùn)算 &
In [99]: a Out[99]: {1, 2, 3, 4, 5} In [100]: b Out[100]: {1, 2, 3, 6} In [101]: a & b Out[101]: {1, 2, 3}
集合異或運(yùn)算 ^
In [102]: a Out[102]: {1, 2, 3, 4, 5} In [103]: b Out[103]: {1, 2, 3, 6} In [104]: a ^ b Out[104]: {4, 5, 6}
把 a, b 集合中的相同元素都去掉,剩下的就是 ^ 異或運(yùn)算的結(jié)果。
應(yīng)用場(chǎng)景
普通for循環(huán)去重
In [1]: li = [2, 1, 3, 6, 2, 1] In [2]: temp = [] In [3]: for i in li: ...: if i not in temp: ...: temp.append(i) ...: In [4]: li Out[4]: [2, 1, 3, 6, 2, 1] In [5]: temp Out[5]: [2, 1, 3, 6]
利用集合簡(jiǎn)單去重
In [106]: li = [1, 2, 2, 3, 3, 5] In [107]: li = set(li) In [108]: li Out[108]: {1, 2, 3, 5} In [109]: type(li) Out[109]: set In [110]:
這樣把原來(lái)的列表類型變成了集合類型,這樣更不好操作,這樣不是想要的結(jié)果。
因此要做到 去重加類型不變,只要再嵌套一個(gè)list() 即可
In [110]: li = [1, 2, 2, 3, 3, 5] In [111]: li = list(set(li)) In [112]: li Out[112]: [1, 2, 3, 5] In [113]: type(li) Out[113]: list In [114]:
去重保持原來(lái)的順序
使用 sort + set 去重
In [6]: list1 = [2, 1, 3, 6, 2, 1] In [7]: list2 = list(set(list1)) In [8]: list2 Out[8]: [1, 2, 3, 6] In [9]: list2.sort(key=list1.index) In [10]: list2 Out[10]: [2, 1, 3, 6]
使用 sorted + set 去重
In [12]: list1 = [2, 1, 3, 6, 2, 1] In [13]: temp = sorted(set(list1), key=list1.index) In [14]: temp Out[14]: [2, 1, 3, 6]
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
利用Python實(shí)現(xiàn)端口掃描器的全過(guò)程
這篇文章主要給大家介紹了關(guān)于如何利用Python實(shí)現(xiàn)端口掃描器的相關(guān)資料,用來(lái)檢測(cè)目標(biāo)服務(wù)器上有哪些端口開(kāi)放,本文適用于有 Python和計(jì)算機(jī)網(wǎng)絡(luò)語(yǔ)言基礎(chǔ)的用戶,需要的朋友可以參考下2021-08-08python抓取網(wǎng)頁(yè)圖片并放到指定文件夾
這篇文章主要介紹了python抓取網(wǎng)頁(yè)圖片并放到指定文件夾,需要的朋友可以參考下2014-04-04Python實(shí)現(xiàn)12306自動(dòng)搶火車票功能
一到國(guó)慶、春節(jié)這種長(zhǎng)假,搶火車票就非常困難?各大互聯(lián)網(wǎng)公司都推出搶票服務(wù),只要加錢給服務(wù)費(fèi)就可以增加搶到票的幾率。本文將和你一起探索搶票軟件背后的原理。2021-12-12Pytorch 計(jì)算誤判率,計(jì)算準(zhǔn)確率,計(jì)算召回率的例子
今天小編就為大家分享一篇Pytorch 計(jì)算誤判率,計(jì)算準(zhǔn)確率,計(jì)算召回率的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01python實(shí)現(xiàn)圖像自動(dòng)Gamma校正方式
這篇文章主要介紹了python實(shí)現(xiàn)圖像自動(dòng)Gamma校正方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10pytorch cuda上tensor的定義 以及減少cpu的操作詳解
這篇文章主要介紹了pytorch cuda上tensor的定義 以及減少cpu的操作詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06Python面向?qū)ο蟪绦蛟O(shè)計(jì)多繼承和多態(tài)用法示例
這篇文章主要介紹了Python面向?qū)ο蟪绦蛟O(shè)計(jì)多繼承和多態(tài)用法,結(jié)合實(shí)例形式分析了Python面向?qū)ο蟪绦蛟O(shè)計(jì)中多繼承、多態(tài)的概念、原理、實(shí)現(xiàn)方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-04-04python如何實(shí)現(xiàn)讀取并顯示圖片(不需要圖形界面)
這篇文章主要介紹了python如何實(shí)現(xiàn)讀取并顯示圖片,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07