Python 提供了一種內置的數據類型 set 來處理集合。
類型集是不重複元素(值不相同的元素,唯一元素)的集合,可以進行並集、積集、差集等集合操作。
本節以示例代碼說明集合類型集合操作中的基本操作。
- 創建集合對象:
{}
,set()
- 設置包含符號
- 集合中的元素數:
len()
- 將元素添加到集合:
add()
- 從集合中移除一個元素:
discard()
,remove()
,pop()
,clear()
- 瓦塞特(合併、聯合):|運算符,
union()
- 產品集(通用部分、交叉點、交叉點):&操作員,
intersection()
- 相對互補:-操作員,
difference()
- 對稱差集:^ 運算符,
symmetric_difference()
- 子集與否:<= 運算符,
issubset()
- 上套與否:>= 運算符,
issuperset()
- 確定它們是否互質:
isdisjoint()
set 類型是可以添加和刪除元素的可變類型,還有一種 freezeset 類型,它具有與 set 類型相同的 set 操作和其他方法但不可變(不能通過添加、刪除或其他方式修改元素來修改) )。
創建集合對象::{},set()
由波括號 {} 生成
set 類型的對象可以通過將元素括在大括號 {} 中來創建。
如果有重複值,它們將被忽略,並且只有唯一值保留為元素。
s = {1, 2, 2, 3, 1, 4}
print(s)
print(type(s))
# {1, 2, 3, 4}
# <class 'set'>
可以有不同的類型作為元素。但是,無法註冊列表類型等可更新對象。允許使用元組。
此外,由於集合類型是無序的,因此不會存儲它們的生成順序。
s = {1.23, 'abc', (0, 1, 2), 'abc'}
print(s)
# {(0, 1, 2), 1.23, 'abc'}
# s = {[0, 1, 2]}
# TypeError: unhashable type: 'list'
不同的類型,例如 int 和 float,如果它們的值相等,則被認為是重複的。
s = {100, 100.0}
print(s)
# {100}
由於空括號 {} 被認為是字典類型,因此可以使用下面描述的構造函數創建空集類型對象(空集)。
s = {}
print(s)
print(type(s))
# {}
# <class 'dict'>
由構造函數 set() 生成
set 類型的對像也可以使用構造函數 set() 創建。
將可迭代對象(如列表或元組)指定為參數會生成一個集合對象,其元素僅為唯一值,不包括重複元素。
l = [1, 2, 2, 3, 1, 4]
print(l)
print(type(l))
# [1, 2, 2, 3, 1, 4]
# <class 'list'>
s_l = set(l)
print(s_l)
print(type(s_l))
# {1, 2, 3, 4}
# <class 'set'>
不可變的frozenset 類型是使用構造函數frozenset() 創建的。
fs_l = frozenset(l)
print(fs_l)
print(type(fs_l))
# frozenset({1, 2, 3, 4})
# <class 'frozenset'>
如果省略參數,則創建一個空集類型對象(空集)。
s = set()
print(s)
print(type(s))
# set()
# <class 'set'>
可以使用 set() 從列表或元組中刪除重複元素,但不會保留原始列表的順序。
要將集合類型轉換為列表或元組,請使用 list(),tuple()。
l = [2, 2, 3, 1, 3, 4]
l_unique = list(set(l))
print(l_unique)
# [1, 2, 3, 4]
有關在保留順序的同時刪除重複元素、僅提取重複元素以及處理二維數組(列表列表)中的重複元素的信息,請參閱以下文章。
設置包含符號
除了列表推導,還有集合推導。只需將列表推導中的方括號 [] 替換為大括號 {}。
s = {i**2 for i in range(5)}
print(s)
# {0, 1, 4, 9, 16}
有關列表理解表示法的更多信息,請參閱以下文章。
- 有關的:如何使用 Python 列表推導
集合中的元素數:len()
可以使用內置函數 len() 獲取集合中元素的數量。
s = {1, 2, 2, 3, 1, 4}
print(s)
print(len(s))
# {1, 2, 3, 4}
# 4
如果要統計每個列表中包含重複值元素的元素數量等,請參閱以下文章。
將元素添加到集合:add()
要將元素添加到集合中,請使用 add() 方法。
s = {0, 1, 2}
s.add(3)
print(s)
# {0, 1, 2, 3}
從集合中移除一個元素:discard(),remove(),pop(),clear()
要從集合中刪除元素,請使用 discard()、remove()、pop() 和 clear() 方法。
discard() 方法刪除參數中指定的元素。如果指定了集合中不存在的值,則不執行任何操作。
s = {0, 1, 2}
s.discard(1)
print(s)
# {0, 2}
s = {0, 1, 2}
s.discard(10)
print(s)
# {0, 1, 2}
remove() 方法也會刪除參數中指定的元素,但如果指定了集合中不存在的值,則會返回錯誤 KeyError。
s = {0, 1, 2}
s.remove(1)
print(s)
# {0, 2}
# s = {0, 1, 2}
# s.remove(10)
# KeyError: 10
pop() 方法從集合中移除元素並返回它們的值。無法選擇要刪除的值。空集將導致 KeyError 錯誤。
s = {2, 1, 0}
v = s.pop()
print(s)
print(v)
# {1, 2}
# 0
s = {2, 1, 0}
print(s.pop())
# 0
print(s.pop())
# 1
print(s.pop())
# 2
# print(s.pop())
# KeyError: 'pop from an empty set'
clear() 方法刪除所有元素並使集合為空。
s = {0, 1, 2}
s.clear()
print(s)
# set()
瓦塞特(合併、聯合):|運算符,union()
聯合集(合併,聯合)可以用 |運算符或 union() 方法。
s1 = {0, 1, 2}
s2 = {1, 2, 3}
s3 = {2, 3, 4}
s_union = s1 | s2
print(s_union)
# {0, 1, 2, 3}
s_union = s1.union(s2)
print(s_union)
# {0, 1, 2, 3}
可以為一個方法指定多個參數。除了集合類型之外,可以通過 set() 轉換為集合類型的列表和元組也可以指定為參數。這同樣適用於後續的運算符和方法。
s_union = s1.union(s2, s3)
print(s_union)
# {0, 1, 2, 3, 4}
s_union = s1.union(s2, [5, 6, 5, 7, 5])
print(s_union)
# {0, 1, 2, 3, 5, 6, 7}
產品集(通用部分、交叉點、交叉點):&操作員,intersection()
乘積集(公共部分、交集、交集)可以用 &運算符或 intersection() 方法。
s_intersection = s1 & s2
print(s_intersection)
# {1, 2}
s_intersection = s1.intersection(s2)
print(s_intersection)
# {1, 2}
s_intersection = s1.intersection(s2, s3)
print(s_intersection)
# {2}
相對互補:-操作員,difference()
可以使用 – 運算符或 difference() 方法獲得差異集。
s_difference = s1 - s2
print(s_difference)
# {0}
s_difference = s1.difference(s2)
print(s_difference)
# {0}
s_difference = s1.difference(s2, s3)
print(s_difference)
# {0}
對稱差集:^ 運算符,symmetric_difference()
可以使用 ^ 運算符或 symmetric_difference() 獲得對稱差分集(僅包含在兩者之一中的元素集)。
相當於邏輯運算中的異或(XOR)。
s_symmetric_difference = s1 ^ s2
print(s_symmetric_difference)
# {0, 3}
s_symmetric_difference = s1.symmetric_difference(s2)
print(s_symmetric_difference)
# {0, 3}
子集與否:<= 運算符,issubset()
要確定一個集合是否是另一個集合的子集,請使用 <= 運算符或 issubset() 方法。
s1 = {0, 1}
s2 = {0, 1, 2, 3}
print(s1 <= s2)
# True
print(s1.issubset(s2))
# True
<= 運算符和 issubset() 方法都為等效集返回 true。
要確定它是否是真正的子集,請使用 <= 運算符,它對等效集返回 false。
print(s1 <= s1)
# True
print(s1.issubset(s1))
# True
print(s1 < s1)
# False
上套與否:>= 運算符,issuperset()
要確定一個集合是否是另一個集合的超集,請使用 >= 運算符或 issuperset()。
s1 = {0, 1}
s2 = {0, 1, 2, 3}
print(s2 >= s1)
# True
print(s2.issuperset(s1))
# True
>= 運算符和 issuperset() 方法都為等效集返回 true。
要確定它是否是真正的超集,請使用 >= 運算符,它對等效集返回 false。
print(s1 >= s1)
# True
print(s1.issuperset(s1))
# True
print(s1 > s1)
# False
確定它們是否互質:isdisjoint()
要確定兩個集合是否互質,請使用 isdisjoint() 方法。
s1 = {0, 1}
s2 = {1, 2}
s3 = {2, 3}
print(s1.isdisjoint(s2))
# False
print(s1.isdisjoint(s3))
# True