Python中的集合(Set)


在Python中,集合(Set) 是一個無序、不重復的序列,它不支持索引。

創建集合

一般在創建集合時,分為創建空集合和非空集合,其創建方式如下:

# 創建空集合
set1 = set()

# 創建同一數據類型元素的集合
set2 = {"a", "b", "c", "d", "e", "f"}

# 創建不同數據類型元素的集合
set3 = {"a", 2, False, ()}

從上面可以看到,我們只需要把集合的所有元素放在 大括號 {} 里面,每個元素之間通過 逗號 , 間隔起來即可,但需要注意的是,我們創建空集合是不能通過 {} 來創建,因為 {} 表示的是一個空字典。

當然,集合中同樣允許存放不同數據類型的元素,但有一點比較特殊,集合中存放的元素必須是不可變對象,而在Python中 list、dict、set 都是可變對象,所以集合中不允許存放 list、dict、set 類型的元素,否則會出現報錯。

>>> set1 = {1, [1, 2]}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>>
>>> set1 = {1, {"name": "wintest"}}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>>
>>> set1 = {1, {1, 2}}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'

我們在集合中可以存放元組,假如我們在元組中存儲有 list、dict、set 類型的對象,然后再把該元組作為一個元素存儲到集合中,這樣做是否可行呢?

答案是否定的。不管嵌套了多少層,只要集合元素中出現了可變對象,存儲到集合時就會出現報錯。

集合中元素不可重復

集合中是不允許出現重復元素的,當我們存儲多個重復元素到集合中,集合就會自動去重,每個元素只保留一個。

>>> set1 = {1, 2, 1, 3, 4, 1, 5, 2, 3}
>>> set1
{1, 2, 3, 4, 5}
>>>
>>> set2 = {"a", "b", "c", "d", "a", "a", "c"}
>>> set2
{'a', 'd', 'b', 'c'}

集合中元素無序

有時候我們會有一種錯覺,認為集合似乎是有序的,比如下面這個例子:

>>> set1 = {2, 6, 5, 4, 1, 3}
>>> set1
{1, 2, 3, 4, 5, 6}

從上面看起來,集合貌似自動進行了排序,但我們在集合中多放幾個元素時,就能夠明顯感受到集合無序的特點,比如下面這個例子:

>>> set1 = {2, 6, 15, 141, 21, 31, 101, 7, 996}
>>> set1
{2, 996, 101, 6, 7, 141, 15, 21, 31}

當我們在使用到集合時,不應該假定其有順序,即便其可能會有某種順序,我們也應該把其當作無序進行使用。

添加集合元素

  • 通過 add() 添加元素

我們把一個元素添加到集合中,如果集合中已經存在該元素,那么集合不進行任何操作。

>>> set1 = {1, 2, 3, 4}
>>>
>>> set1.add(5)
>>> set1
{1, 2, 3, 4, 5}
>>>
>>> set1.add(3)
>>> set1
{1, 2, 3, 4, 5}
  • 通過 update() 添加元素

我們通過 update() 添加元素時,參數必須是可迭代對象,比如可以是 str、list、tuple、set、dict 等類型,該方法不同於 add() 方法,add() 是把參數當作一個整體添加到集合中,而 update() 則是把參數里的所有元素逐一添加到集合中。

>>> set1 = {1, 2, 3, 4}
>>>
>>> set1.update("ab")
>>> set1
{1, 2, 3, 4, 'a', 'b'}
>>>
>>> set1.update([11, 22])
>>> set1
{1, 2, 3, 4, 11, 'a', 22, 'b'}
>>>
>>> set1.update((33, (44, 55)))
>>> set1
{1, 2, 3, 4, 33, 11, 'a', 22, (44, 55), 'b'}

如果添加的元素在集合中已經存在,那么該元素只會出現一次,會忽略掉重復元素。

>>> set1 = {1, 2, 3, 4}
>>>
>>> set1.update([11, 22], (22, 33))  # 添加中有重復元素
>>> set1
{1, 2, 3, 4, 33, 11, 22}
>>>

刪除集合元素

  • 通過 remove() 刪除指定元素,元素不存在則報錯
>>> set1 = {1, 2, 3, 4}
>>>
>>> set1.remove(2)
>>> set1
{1, 3, 4}
>>>
>>> set1.remove(2)  # 元素不存在,會報錯
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 2
  • 通過 discard() 刪除指定元素,元素不存在不會報錯
>>> set1 = {1, 2, 3, 4}
>>>
>>> set1.discard(2)
>>> set1
{1, 3, 4}
>>>
>>> set1.discard(2)  # 元素不存在,並不會報錯
>>> set1
{1, 3, 4}
  • 通過 pop() 隨機刪除元素,會返回刪除的元素
>>> set1 = {2, 6, 15, 141, 21, 31, 101, 7, 996}
>>>
>>> set1.pop()
2
>>> set1.pop()
996
>>> set1.pop()
101
>>> set1.pop()
6
>>> set1.pop()
7
>>> set1
{141, 15, 21, 31}

如果集合為空時使用 pop() 方法,則會出現報錯:

>>> set1 = set()
>>>
>>> set1.pop()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'pop from an empty set'
  • 通過 clear() 刪除集合所有元素
>>> set1 = {1, 2, 3, 4}
>>>
>>> set1.clear()
>>>
>>> print(set1)
set()

集合運算操作符

  • 運算符 & ,取交集,返回2個集合中相同的元素
>>> set1 = {1, 2, 3, 4}
>>> set2 = {1, 5, 6, 4}
>>>
>>> set1 & set2
{1, 4}
  • 運算符 | ,取並集,合並2個集合並去除重復元素
>>> set1 = {1, 2, 3, 4}
>>> set2 = {1, 5, 6, 4}
>>>
>>> set1 | set2
{1, 2, 3, 4, 5, 6}
  • 運算符 - ,取差集,從集合中去除元素
>>> set1 = {1, 2, 3, 4}
>>> set2 = {1, 5, 6, 4}
>>>
>>> set1 - set2
{2, 3}
>>>
>>> set2 - set1
{5, 6}
  • 運算符 ^ ,取對稱差集,返回兩個集合中不重復的元素集合
>>> set1 = {1, 2, 3, 4}
>>> set2 = {1, 5, 6, 4}
>>>
>>> set1 ^ set2
{2, 3, 5, 6}
  • 關鍵字 in

通過關鍵字 in ,可檢查當前集合中是否包含指定元素,返回結果為布爾值 True 或 False。

>>> set1 = {1, 2, 3, 4}
>>>
>>> print(2 in set1)
True
>>>
>>> print(6 in set1)
False

通過關鍵字 in ,還可以用於遍歷當前集合。

books = {"語文", "數學", "英語", "歷史", "物理", "化學"}
for i in books:
    print(i, end=" ")

集合常見函數&方法

函數 & 方法 描述
len(set) 返回集合元素個數
max(set) 返回集合元素最大值
min(set) 返回集合元素最小值
set(iterable) 將可迭代對象轉換為集合,若 iterable 為空則創建空集合
set.add(obj) 給集合添加元素
set.update(obj) 給集合添加元素
set.remove(obj) 刪除集合中指定元素,元素不存在會報錯
set.discard(obj) 刪除集合中指定元素,元素不存在不會報錯
set.pop() 隨機刪除元素
set.clear() 清空集合中所有元素
set.copy() 拷貝一個集合,使用的是淺拷貝
set1.difference(set2) 返回多個集合的差集
set1.intersection(set2) 返回集合的交集
set1.isdisjoint(set2) 判斷兩個集合是否包含相同的元素,如果沒有返回 True,否則返回 False
set1.issubset(set2) 判斷指定集合是否為該方法參數集合的子集
set1.symmetric_difference(set2) 返回兩個集合中不重復的元素集合
set1.union(set2) 返回兩個集合的並集


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM