在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) | 返回兩個集合的並集 |