在 Python 數(shù)據(jù)處理中,集合(set)是一種無序、不重復的可變?nèi)萜鳎瑢?“元素唯一性判斷” 與 “集合間關(guān)系計算” 設計。無論是去重、篩選共同元素,還是合并數(shù)據(jù),集合運算都能提供高效簡潔的解決方案。小編將梳理 Python 集合的 6 類核心運算,重點解析交集、并集的實現(xiàn)方法,助你快速掌握集合在實際開發(fā)中的應用。
一、集合的核心特性:為何適合運算?
在學習運算前,需先明確集合的兩大關(guān)鍵特性,這是其高效運算的基礎:
元素唯一性:集合自動去重,同一元素在集合中僅出現(xiàn)一次(如{1,2,2,3}會自動變?yōu)閧1,2,3}),無需手動處理重復數(shù)據(jù);
無序性:集合不記錄元素插入順序,也不支持索引訪問(如set1[0]會報錯),但底層采用哈希表實現(xiàn),判斷元素是否存在(in操作)的時間復雜度為 O (1),遠快于列表的 O (n)。
正因為這些特性,集合在 “去重”“關(guān)系判斷” 場景中效率顯著,例如篩選兩個列表的共同元素、合并多個數(shù)據(jù)集并去重等。
二、Python 集合的 6 類核心運算
Python 集合支持數(shù)學意義上的集合運算,包括交集、并集、差集、對稱差集等,每種運算均提供 “運算符” 與 “內(nèi)置方法” 兩種實現(xiàn)方式,可根據(jù)代碼可讀性需求選擇。
(一)交集:取兩個集合的共同元素
定義:返回同時存在于兩個集合中的所有元素,數(shù)學符號為 “∩”。
適用場景:篩選兩個數(shù)據(jù)集的重疊部分,如 “找出同時購買 A 商品與 B 商品的用戶 ID”。
實現(xiàn)方式:
運算符&:直接用set1 & set2計算交集,結(jié)果為新集合;
內(nèi)置方法intersection():調(diào)用set1.intersection(set2),支持傳入多個集合(如set1.intersection(set2, set3)取三個集合的共同元素)。
示例:
TypeScript取消自動換行復制
# 定義兩個用戶集合(存儲用戶ID)
users_a = {101, 102, 103, 104} # 購買A商品的用戶
users_b = {103, 104, 105, 106} # 購買B商品的用戶
# 方法1:用&運算符求交集
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}
# 擴展:求三個集合的交集
users_c = {104, 105, 107}
common_three = users_a.intersection(users_b, users_c)
print(common_three) # 輸出:{104}
(二)并集:合并兩個集合并去重
定義:返回兩個集合中所有不重復的元素,數(shù)學符號為 “∪”。
適用場景:合并多個數(shù)據(jù)集并自動去重,如 “匯總 A、B 兩個渠道的用戶 ID,避免重復統(tǒng)計”。
實現(xiàn)方式:
運算符|:用set1 | set2合并集合,自動去重;
內(nèi)置方法union():調(diào)用set1.union(set2),同樣支持傳入多個集合。
示例:
TypeScript取消自動換行復制
# 定義兩個渠道的用戶集合
channel_x = {201, 202, 203}
channel_y = {203, 204, 205}
# 方法1:用|運算符求并集
total_users1 = channel_x | channel_y
print(total_users1) # 輸出:{201, 202, 203, 204, 205}(自動去重203)
# 方法2:用union()方法求并集
total_users2 = channel_x.union(channel_y)
print(total_users2) # 輸出:{201, 202, 203, 204, 205}
(三)其他常用集合運算
除交集、并集外,以下 4 類運算也高頻使用:
差集:返回僅在第一個集合中存在的元素,用-運算符或difference()方法實現(xiàn)(如users_a - users_b,輸出{101, 102});
對稱差集:返回僅在其中一個集合中存在的元素(即 “并集減交集”),用^運算符或symmetric_difference()方法實現(xiàn)(如users_a ^ users_b,輸出{101, 102, 105, 106});
子集判斷:判斷集合 A 是否完全包含于集合 B,用<=運算符或issubset()方法(如{103,104} <= users_a,輸出True);
超集判斷:判斷集合 A 是否完全包含集合 B,用>=運算符或issuperset()方法(如users_a >= {103,104},輸出True)。
三、集合運算的注意事項
數(shù)據(jù)類型限制:集合的元素必須是 “可哈希” 類型(如整數(shù)、字符串、元組),列表、字典等不可哈希類型不能作為集合元素(如{[1,2], 3}會報錯);
運算結(jié)果為新集合:所有集合運算(如&、|、intersection())均返回新集合,不會修改原集合。若需直接修改原集合,可使用 “增強運算符” 或?qū)?“更新方法”,例如:
交集更新:set1 &= set2(等價于set1.intersection_update(set2)),直接修改set1為交集結(jié)果;
并集更新:set1 |= set2(等價于set1.update(set2)),直接將set2的元素合并到set1中并去重;
空集合的創(chuàng)建:不能用{}創(chuàng)建空集合({}表示空字典),需用set()創(chuàng)建(如empty_set = set())。
Python 集合運算以 “高效、簡潔” 為核心優(yōu)勢,其中交集(&/intersection())與并集(|/union())是最常用的兩種運算,分別適用于 “篩選共同元素” 與 “合并去重” 場景。實際開發(fā)中,需根據(jù)代碼可讀性選擇實現(xiàn)方式(運算符更簡潔,方法更直觀),同時注意集合元素的可哈希性與空集合的創(chuàng)建方式。