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) 返回兩個集合的並集
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章