Python容器型數(shù)據(jù)類型 - 集合

通常我們對(duì)集合的定義是"把一定范圍的,確定的,可以區(qū)別的事物當(dāng)作一個(gè)整體來看待",集合中的各個(gè)事物通常稱為集合的元素,集合應(yīng)該滿足以下特性:

  1. 無序性:一個(gè)集合中,每個(gè)元素的地位都是相通的,元素之間是無序的
  2. 互異性:一個(gè)集合中,任何兩個(gè)元素都認(rèn)為是不相同的,即每個(gè)元素只能出現(xiàn)一次
  3. 確定性:給定一個(gè)集合,任給一個(gè)元素,該元素或者屬于或者不屬于該集合,二者必居其一,不允許有模棱兩可的情況出現(xiàn)
創(chuàng)建集合

創(chuàng)建集合可以使用{}字面量語法,{}中需要至少有一個(gè)元素,因?yàn)闆]有元素的{}并不是空集合,而是一個(gè)空字典。也可以使用內(nèi)置函數(shù)set來創(chuàng)建一個(gè)集合,準(zhǔn)確的說set并不是一個(gè)函數(shù),而是創(chuàng)建集合對(duì)象的構(gòu)造器。set也可以將其他序列轉(zhuǎn)成集合,例如:set('hello')會(huì)得到一個(gè)包含了4個(gè)字符的集合(重復(fù)的l會(huì)被去掉)

集合的運(yùn)算
set1 = {1, 2, 3, 4, 5}
set2 = {2, 4, 6, 8}
# 成員運(yùn)算 - 確定性(元素要么在集合中,要么不在集合中)
# 集合的成員運(yùn)算在效率上是遠(yuǎn)遠(yuǎn)高于列表的成員運(yùn)算
print(1 in set1)        # True
print(1  not in set1)       # False
# 交集
print(set1 & set2)       # {2, 4}
print(set1.intersection(set2))        # {2, 4}
# 并集
print(set1 | set2)       # {1, 2, 3, 4, 5, 6, 8}
print(set1.union(set2))      # {1, 2, 3, 4, 5, 6, 8}
#差集
print(set1 - set2)     # {1, 3, 5}
print(set1.difference(set2))       # {1, 3, 5}
print(set2 - set1)      # {8, 6}
# 對(duì)稱差
print(set1 ^ set2)       # {1, 3, 5, 6, 8}
print((set1 | set2) - (set1 & set2))       # {1, 3, 5, 6, 8}
print(set1.symmetric_difference(set2))       # {1, 3, 5, 6, 8}
集合的操作

集合底層使用的是哈希存儲(chǔ),通過計(jì)算元素的哈希碼來決定元素存儲(chǔ)的位置,這是一種高效率的存儲(chǔ)方案
哈希存儲(chǔ)的關(guān)鍵是設(shè)計(jì)一個(gè)好的哈希函數(shù),盡量保證不同的對(duì)象能夠計(jì)算出不同的哈希碼
可變?nèi)萜鳎斜?,集合,字典)都無法計(jì)算哈希碼,因此都不能放到集合中,作為集合的元素

set1 = {'apple', 'banana', 'pitaya', 'apple'}
# 集合中可以放元組,因?yàn)樵M是不可變的
set2 = {(1, 2, 3), (4, 5, 6)}
# 添加元素
set1.add('grape')
print(set1)         # {'pitaya', 'apple', 'grape', 'banana'}
# 刪除元素 - discard刪除已知元素,pop是隨機(jī)刪除一個(gè)元素
set1.discard('pitaya')
print(set1.pop())       # grape
print(set1)        # {'banana', 'apple'}
# 清空元素
set1.clear()
print(set1)       # set()

# 列表可以轉(zhuǎn)為集合,然后在轉(zhuǎn)回列表(去重)
nums = [1, 2, 1, 10, 10, 10, 5, 3, 9, 9]
set3 = set(nums)
print(set1)        # {1, 2, 3, 5, 9, 10}
list1 = list(set3)
print(list1)       # [1, 2, 3, 5, 9, 10]
# 列表可以轉(zhuǎn)為元組
tuple1 = tuple(list1)
print(tuple1)        # (1, 2, 3, 5, 9, 10)

set4 = set('hello')
print(set4)        # {'e', 'l', 'o', 'h'}
不可變集合

Python中還有一種不可變的集合,名字叫frozenset,set和rozenset的區(qū)別就如同list(列表)和tuple(元組)的區(qū)別,frozenset由于是不可變類型,能夠計(jì)算出哈希碼,因此它可以作為set中的元素。除了不能添加和刪除元素,frozenset在其他方面和set基本一樣

set1 = frozenset({1, 3, 5, 7})
set2 = frozenset(range(1, 6))
print(set1 & set2)       # frozenset({1, 3, 5})
print(set1 | set2)       # frozenset({1, 2, 3, 4, 5, 7})
print(set1 - set2)       # frozenset({7})
print(set2 < set2)      # False
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容