在本文中,您將學(xué)習(xí)關(guān)于Python集的所有內(nèi)容;如何創(chuàng)建它們、添加或刪除其中的元素,以及在Python中對(duì)集合執(zhí)行的所有操作。
集合是項(xiàng)目的無(wú)序集合。每個(gè)元素都是唯一的(沒(méi)有重復(fù)項(xiàng)),并且必須是不可變的(不能更改)。
但是,集合本身是可變的。我們可以在其中添加或刪除項(xiàng)目。
集合可用于執(zhí)行數(shù)學(xué)集合運(yùn)算,例如并集,交集,對(duì)稱差等。
通過(guò)將所有項(xiàng)目(元素)放在大括號(hào){}中并用逗號(hào)分隔或使用內(nèi)置函數(shù)來(lái)創(chuàng)建集合set()。
它可以具有任意數(shù)量的項(xiàng)目,并且它們可以具有不同的類型(整數(shù),浮點(diǎn)數(shù),元組,字符串等)。但是集合不能具有可變?cè)兀ɡ?a href="python-list.html" title="Python清單">list,set或dictionary)作為其元素。
# 整數(shù)集 my_set = {1, 2, 3} print(my_set) # 混合數(shù)據(jù)類型集 my_set = {1.0, "Hello", (1, 2, 3)} print(my_set)
也嘗試以下示例。
# 無(wú)重復(fù)集合 # 輸出: {1, 2, 3, 4} my_set = {1,2,3,4,3,2} print(my_set) #set不能包含可變項(xiàng) #這里[3,4]是可變列表 #如果您取消注釋第12行, #這將導(dǎo)致錯(cuò)誤。 # TypeError: unhashable type: 'list' #my_set = {1, 2, [3, 4]} # 我們可以從列表中生成集合 # 輸出: {1, 2, 3} my_set = set([1,2,3,2]) print(my_set)
創(chuàng)建一個(gè)空集有點(diǎn)特殊。
空括號(hào){}將在Python中創(chuàng)建一個(gè)空字典。為了建立一個(gè)沒(méi)有任何元素的集合,我們使用沒(méi)有任何參數(shù)的set()函數(shù)。
# 用{}初始化 a = {} # 檢查a的數(shù)據(jù)類型 # 輸出: <class 'dict'> print(type(a)) # 初始化使用 set() a = set() # 檢查a的數(shù)據(jù)類型 # 輸出: <class 'set'> print(type(a))
集是可變的。但是由于它們是無(wú)序的,因此索引沒(méi)有意義。
我們無(wú)法使用索引或切片來(lái)訪問(wèn)或更改集合的元素。集不支持它。
我們可以使用add()方法添加單個(gè)元素,使用update()方法添加多個(gè)元素。update()方法可以采用元組,列表,字符串或其他集合作為其參數(shù)。在所有情況下,都避免重復(fù)。
# 初始化 my_set my_set = {1,3} print(my_set) # 如果取消注釋第9行, # 你會(huì)得到一個(gè)錯(cuò)誤 # TypeError: 'set' object does not support indexing #my_set[0] # 增加一個(gè)元素 # 輸出: {1, 2, 3} my_set.add(2) print(my_set) # 增加多個(gè)元素 # 輸出: {1, 2, 3, 4} my_set.update([2,3,4]) print(my_set) # 增加 list 和set # 輸出: {1, 2, 3, 4, 5, 6, 8} my_set.update([4,5], {1,6,8}) print(my_set)
運(yùn)行該程序時(shí),輸出為:
{1, 3} {1, 2, 3} {1, 2, 3, 4} {1, 2, 3, 4, 5, 6, 8}
可以使用discard()和remove()方法從集合中刪除特定項(xiàng)目。
兩者之間的唯一區(qū)別是,如果使用discard(),而項(xiàng)目不存在于集合中,則它保持不變。但是remove()在這種情況下會(huì)引發(fā)錯(cuò)誤。
以下示例將說(shuō)明這一點(diǎn)。
# 初始化 my_set my_set = {1, 3, 4, 5, 6} print(my_set) # 拋棄一個(gè)元素 # 輸出: {1, 3, 5, 6} my_set.discard(4) print(my_set) # 移除已個(gè)元素 # 輸出: {1, 3, 5} my_set.remove(6) print(my_set) # 拋棄一個(gè)元素 # 沒(méi)有出現(xiàn)在 my_set # 輸出: {1, 3, 5} my_set.discard(2) print(my_set) # remove一個(gè)元素 # 沒(méi)有出現(xiàn)在 my_set # 如果沒(méi)有注釋#my_set.remove(2), # 會(huì)拋出一個(gè)錯(cuò)誤. # Output: KeyError: 2 #my_set.remove(2)
同樣,我們可以使用pop()方法刪除并返回一個(gè)項(xiàng)目。
集合為無(wú)序,無(wú)法確定將彈出哪個(gè)項(xiàng)目。這是完全任意的。
我們還可以使用clear()方法刪除集合中的所有項(xiàng)目。
# 初始化 my_set # 輸出: 唯一元素集 my_set = set("HelloWorld") print(my_set) # pop一個(gè)元素 # 輸出: 隨機(jī)元素 print(my_set.pop()) # pop 任意元素 # Output:隨機(jī)元素 my_set.pop() print(my_set) # 清空 my_set #輸出: set() my_set.clear() print(my_set)
集合可用于執(zhí)行數(shù)學(xué)集合運(yùn)算,例如并集,交集,差和對(duì)稱差。我們可以通過(guò)運(yùn)算符或方法來(lái)實(shí)現(xiàn)。。
讓我們考慮以下兩組用于以下操作。
>>> A = {1, 2, 3, 4, 5} >>> B = {4, 5, 6, 7, 8}
A和B的并集是來(lái)自這兩個(gè)集合的所有元素的集合。
并集是使用|操作符執(zhí)行的。也可以使用union()方法來(lái)完成。
# 初始化 A 和 B A = {1, 2, 3, 4, 5} B = {4, 5, 6, 7, 8} # 使用 | 運(yùn)算符 # 輸出: {1, 2, 3, 4, 5, 6, 7, 8} print(A | B)
在Python shell上嘗試以下示例。
# 使用union 函數(shù) >>> A.union(B) {1, 2, 3, 4, 5, 6, 7, 8} # 在B上使用并集函數(shù) >>> B.union(A) {1, 2, 3, 4, 5, 6, 7, 8}
A和B的交集是在這兩個(gè)集合中共有的一組元素。
交點(diǎn)使用&運(yùn)算符執(zhí)行。使用intersection()方法可以完成相同的操作。
# 初始化 A 和 B A = {1, 2, 3, 4, 5} B = {4, 5, 6, 7, 8} # 使用 & 運(yùn)算符 # 輸出 : {4, 5} print(A & B)
在Python shell上嘗試以下示例。
# 在A上使用交集函數(shù) >>> A.intersection(B) {4, 5} # 在B上使用交集函數(shù) >>> B.intersection(A) {4, 5}
A和B的差(A-B)是僅在A中但不在B中的一組元素。類似地,B-A是B中但不在A中的一組元素。
差異是使用 -運(yùn)算符執(zhí)行的。使用difference()方法可以完成相同的操作。
# 初始化 A 和 B A = {1, 2, 3, 4, 5} B = {4, 5, 6, 7, 8} # 在A上使用 - 運(yùn)算符 # Output: {1, 2, 3} print(A - B)
在Python shell上嘗試以下示例。
# 在A上使用差異函數(shù) >>> A.difference(B) {1, 2, 3} # 在B上使用-運(yùn)算符符 >>> B - A {8, 6, 7} # 在B上使用差異函數(shù) >>> B.difference(A) {8, 6, 7}
A和B的對(duì)稱差異是A和B中的一組元素,但兩者中的元素相同。
對(duì)稱差使用^運(yùn)算符執(zhí)行。使用symmetric_difference()方法可以完成相同的操作。
# 初始化 A 和 B A = {1, 2, 3, 4, 5} B = {4, 5, 6, 7, 8} # 使用 ^ 運(yùn)算符 # 輸出: {1, 2, 3, 6, 7, 8} print(A ^ B)
在Python shell上嘗試以下示例。
# 在A上使用symmetric_difference函數(shù) >>> A.symmetric_difference(B) {1, 2, 3, 6, 7, 8} # 在B上使用symmetric_difference函數(shù) >>> B.symmetric_difference(A) {1, 2, 3, 6, 7, 8}
集合方法很多,上面已經(jīng)使用了其中的一些方法。這是set對(duì)象可用的所有方法的列表。
方法 | 描述 |
---|---|
add() | 將元素添加到集合中 |
clear() | 從集合中刪除所有元素 |
copy() | 返回集合的副本 |
difference() | 返回兩個(gè)或多個(gè)集合的差作為新集合 |
difference_update() | 從該集合中刪除另一個(gè)集合的所有元素 |
discard() | 如果元素是成員,則從集合中刪除它。(如果元素不在集合中,則不執(zhí)行任何操作) |
intersection() | 返回兩個(gè)集合的交集作為新集合 |
intersection_update() | 用自身和另一個(gè)的交集更新集合 |
isdisjoint() | True如果兩個(gè)集合的交點(diǎn)為空,則返回 |
issubset() | 返回 True另一個(gè)集合是否包含此集合 |
issuperset() | 返回 True此集合是否包含另一個(gè)集合 |
pop() | 刪除并返回一個(gè)任意的set元素。提高KeyError,如果集合為空 |
remove() | 從集合中刪除一個(gè)元素。如果元素不是成員,則引發(fā)一個(gè)KeyError |
symmetric_difference() | 將兩個(gè)集合的對(duì)稱差作為新集合返回 |
symmetric_difference_update() | 用本身和另一個(gè)的對(duì)稱差異更新一個(gè)集合 |
union() | 返回新集合中集合的并集 |
update() | 用自身和其他元素的并集更新集合 |
我們可以使用in關(guān)鍵字來(lái)測(cè)試項(xiàng)目是否存在于集合中。
# 初始化 my_set my_set = set("apple") # 檢查“a”是否存在 # 輸出: True print('a' in my_set) # 檢查“p”是否存在 # 輸出: False print('p' not in my_set)
使用for循環(huán),我們可以遍歷集合中的每個(gè)項(xiàng)目。
>>> for letter in set("apple"): ... print(letter) ... a p e l
內(nèi)置函數(shù)如all()、any()、enumerate()、len()、max()、min()、sort()、sum()等常用來(lái)與set一起執(zhí)行不同的任務(wù)。
功能 | 描述 |
---|---|
all() | 如果集合的所有元素都為true(或者集合為空),則返回True。 |
any() | 如果集合中的任何元素為true,則返回True。 如果集合為空,則返回False。 |
enumerate() | 返回一個(gè)枚舉對(duì)象。它包含成對(duì)的所有項(xiàng)的索引和值。 |
len() | 返回集合中的長(zhǎng)度(項(xiàng)目數(shù))。 |
max() | 返回集合中最大的項(xiàng)目。 |
min() | 返回集合中最小的項(xiàng)目。 |
sorted() | 從集合中的元素返回一個(gè)新的排序列表(不對(duì)集合本身進(jìn)行排序)。 |
sum() | 返回集合中所有元素的總和。 |
Frozenset是具有集合特征的新類,但是一旦分配,就不能更改其元素。元組是不可變列表,而凍結(jié)集是不可變集。
可變的集合不可散列,因此不能用作字典鍵。另一方面,frozenset是可哈?;?,可用作字典的鍵。
可以使用函數(shù)Frozenset()創(chuàng)建Frozensets。
此數(shù)據(jù)類型支持的方法,如copy(),difference(),intersection(),isdisjoint(),issubset(),issuperset(),symmetric_difference()和union()。由于不可變,因此沒(méi)有添加或刪除元素的方法。
# 初始化 A 和 B A = frozenset([1, 2, 3, 4]) B = frozenset([3, 4, 5, 6])
在Python shell上嘗試這些示例。
>>> A.isdisjoint(B) False >>> A.difference(B) frozenset({1, 2}) >>> A | B frozenset({1, 2, 3, 4, 5, 6}) >>> A.add(3) ... AttributeError: 'frozenset' object has no attribute 'add'