在 Python 數(shù)據(jù)處理中,集合(set)是一種無(wú)序、不重復(fù)的可變?nèi)萜?,專?“元素唯一性判斷” 與 “集合間關(guān)系計(jì)算” 設(shè)計(jì)。無(wú)論是去重、篩選共同元素,還是合并數(shù)據(jù),集合運(yùn)算都能提供高效簡(jiǎn)潔的解決方案。小編將梳理 Python 集合的 6 類核心運(yùn)算,重點(diǎn)解析交集、并集的實(shí)現(xiàn)方法,助你快速掌握集合在實(shí)際開(kāi)發(fā)中的應(yīng)用。
一、集合的核心特性:為何適合運(yùn)算?
在學(xué)習(xí)運(yùn)算前,需先明確集合的兩大關(guān)鍵特性,這是其高效運(yùn)算的基礎(chǔ):
元素唯一性:集合自動(dòng)去重,同一元素在集合中僅出現(xiàn)一次(如{1,2,2,3}會(huì)自動(dòng)變?yōu)閧1,2,3}),無(wú)需手動(dòng)處理重復(fù)數(shù)據(jù);
無(wú)序性:集合不記錄元素插入順序,也不支持索引訪問(wèn)(如set1[0]會(huì)報(bào)錯(cuò)),但底層采用哈希表實(shí)現(xiàn),判斷元素是否存在(in操作)的時(shí)間復(fù)雜度為 O (1),遠(yuǎn)快于列表的 O (n)。
正因?yàn)檫@些特性,集合在 “去重”“關(guān)系判斷” 場(chǎng)景中效率顯著,例如篩選兩個(gè)列表的共同元素、合并多個(gè)數(shù)據(jù)集并去重等。

二、Python 集合的 6 類核心運(yùn)算
Python 集合支持?jǐn)?shù)學(xué)意義上的集合運(yùn)算,包括交集、并集、差集、對(duì)稱差集等,每種運(yùn)算均提供 “運(yùn)算符” 與 “內(nèi)置方法” 兩種實(shí)現(xiàn)方式,可根據(jù)代碼可讀性需求選擇。
(一)交集:取兩個(gè)集合的共同元素
定義:返回同時(shí)存在于兩個(gè)集合中的所有元素,數(shù)學(xué)符號(hào)為 “∩”。
適用場(chǎng)景:篩選兩個(gè)數(shù)據(jù)集的重疊部分,如 “找出同時(shí)購(gòu)買 A 商品與 B 商品的用戶 ID”。
實(shí)現(xiàn)方式:
運(yùn)算符&:直接用set1 & set2計(jì)算交集,結(jié)果為新集合;
內(nèi)置方法intersection():調(diào)用set1.intersection(set2),支持傳入多個(gè)集合(如set1.intersection(set2, set3)取三個(gè)集合的共同元素)。
示例:
TypeScript取消自動(dòng)換行復(fù)制
# 定義兩個(gè)用戶集合(存儲(chǔ)用戶ID)
users_a = {101, 102, 103, 104} # 購(gòu)買A商品的用戶
users_b = {103, 104, 105, 106} # 購(gòu)買B商品的用戶
# 方法1:用&運(yùn)算符求交集
common_users1 = users_a & users_b
print(common_users1) # 輸出:{103, 104}
# 方法2:用intersection()方法求交集
common_users2 = users_a.intersection(users_b)
print(common_users2) # 輸出:{103, 104}
# 擴(kuò)展:求三個(gè)集合的交集
users_c = {104, 105, 107}
common_three = users_a.intersection(users_b, users_c)
print(common_three) # 輸出:{104}
(二)并集:合并兩個(gè)集合并去重
定義:返回兩個(gè)集合中所有不重復(fù)的元素,數(shù)學(xué)符號(hào)為 “∪”。
適用場(chǎng)景:合并多個(gè)數(shù)據(jù)集并自動(dòng)去重,如 “匯總 A、B 兩個(gè)渠道的用戶 ID,避免重復(fù)統(tǒng)計(jì)”。
實(shí)現(xiàn)方式:
運(yùn)算符|:用set1 | set2合并集合,自動(dòng)去重;
內(nèi)置方法union():調(diào)用set1.union(set2),同樣支持傳入多個(gè)集合。
示例:
TypeScript取消自動(dòng)換行復(fù)制
# 定義兩個(gè)渠道的用戶集合
channel_x = {201, 202, 203}
channel_y = {203, 204, 205}
# 方法1:用|運(yùn)算符求并集
total_users1 = channel_x | channel_y
print(total_users1) # 輸出:{201, 202, 203, 204, 205}(自動(dòng)去重203)
# 方法2:用union()方法求并集
total_users2 = channel_x.union(channel_y)
print(total_users2) # 輸出:{201, 202, 203, 204, 205}
(三)其他常用集合運(yùn)算
除交集、并集外,以下 4 類運(yùn)算也高頻使用:
差集:返回僅在第一個(gè)集合中存在的元素,用-運(yùn)算符或difference()方法實(shí)現(xiàn)(如users_a - users_b,輸出{101, 102});
對(duì)稱差集:返回僅在其中一個(gè)集合中存在的元素(即 “并集減交集”),用^運(yùn)算符或symmetric_difference()方法實(shí)現(xiàn)(如users_a ^ users_b,輸出{101, 102, 105, 106});
子集判斷:判斷集合 A 是否完全包含于集合 B,用<=運(yùn)算符或issubset()方法(如{103,104} <= users_a,輸出True);
超集判斷:判斷集合 A 是否完全包含集合 B,用>=運(yùn)算符或issuperset()方法(如users_a >= {103,104},輸出True)。
三、集合運(yùn)算的注意事項(xiàng)
數(shù)據(jù)類型限制:集合的元素必須是 “可哈?!?類型(如整數(shù)、字符串、元組),列表、字典等不可哈希類型不能作為集合元素(如{[1,2], 3}會(huì)報(bào)錯(cuò));
運(yùn)算結(jié)果為新集合:所有集合運(yùn)算(如&、|、intersection())均返回新集合,不會(huì)修改原集合。若需直接修改原集合,可使用 “增強(qiáng)運(yùn)算符” 或?qū)?yīng) “更新方法”,例如:
交集更新:set1 &= set2(等價(jià)于set1.intersection_update(set2)),直接修改set1為交集結(jié)果;
并集更新:set1 |= set2(等價(jià)于set1.update(set2)),直接將set2的元素合并到set1中并去重;
空集合的創(chuàng)建:不能用{}創(chuàng)建空集合({}表示空字典),需用set()創(chuàng)建(如empty_set = set())。
Python 集合運(yùn)算以 “高效、簡(jiǎn)潔” 為核心優(yōu)勢(shì),其中交集(&/intersection())與并集(|/union())是最常用的兩種運(yùn)算,分別適用于 “篩選共同元素” 與 “合并去重” 場(chǎng)景。實(shí)際開(kāi)發(fā)中,需根據(jù)代碼可讀性選擇實(shí)現(xiàn)方式(運(yùn)算符更簡(jiǎn)潔,方法更直觀),同時(shí)注意集合元素的可哈希性與空集合的創(chuàng)建方式。