溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何理解Python中的set

發(fā)布時(shí)間:2021-09-24 15:30:47 來源:億速云 閱讀:147 作者:柒染 欄目:開發(fā)技術(shù)

今天就跟大家聊聊有關(guān)如何理解Python中的set,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

    引言

    set(集合)雖然用的很少,但它是一個(gè)無序的不重復(fù)元素序列,用來簡單的去重挺快的。

    集合的定義

    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 = {} 來定義這樣默認(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)置方法如下:

    如何理解Python中的set

    方法太多我選幾個(gè)常用的測試一下。

    集合添加元素

    使用 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()

    集合元素獲取(遍歷)

    集合不支持索引,也沒有方法進(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)用場景

    普通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]

    利用集合簡單去重

    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]:

    這樣把原來的列表類型變成了集合類型,這樣更不好操作,這樣不是想要的結(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]:

    去重保持原來的順序

    使用 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]

    看完上述內(nèi)容,你們對(duì)如何理解Python中的set有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI