三種方式實現 Python 中的集合的交、並、補運算

三種方式實現 Python 中的集合的交、並、補運算

一 背景

集合這個概念在我們高中階段就有所瞭解,畢業已多年,我們一起回顧一下幾個集合相關的基本概念吧?

集合是指具有某種特定性質的具體的或抽象的對象彙總而成的集體。其中,構成集合的這些對象則稱爲該集合的元素。

集合具有以下幾種性質:

  • 確定性
    給定一個集合,任給一個元素,該元素或者屬於或者不屬於該集合,二者必居其一,不允許有模棱兩可的情況出現。
  • 互異性
    一個集合中,任何兩個元素都認爲是不相同的,即每個元素只能出現一次。有時需要對同一元素出現多次的情形進行刻畫,可以使用多重集,其中的元素允許出現多次。
  • 無序性
    一個集合中,每個元素的地位都是相同的,元素之間是無序的。集合上可以定義序關係,定義了序關係後,元素之間就可以按照序關係排序。但就集合本身的特性而言,元素之間沒有必然的序。

交集定義:由屬於A且屬於B的相同元素組成的集合,記作A∩B(或B∩A),讀作“A交B”(或“B交A”),即A∩B={x|x∈A,且x∈B}, 如右圖所示。注意交集越交越少。若A包含B,則A∩B=B,A∪B=A。

並集定義:由所有屬於集合A或屬於集合B的元素所組成的集合,記作A∪B(或B∪A),讀作“A並B”(或“B並A”),即A∪B={x|x∈A,或x∈B},注意並集越並越多,這與交集的情況正相反。

補集
補集又可分爲相對補集和絕對補集。
相對補集定義:由屬於A而不屬於B的元素組成的集合,稱爲B關於A的相對補集,記作A-B或A\B,即A-B={x|x∈A,且x∉B’}。
絕對補集定義:A關於全集合U的相對補集稱作A的絕對補集,記作A’或∁u(A)或~A。有U’=Φ;Φ’=U。

在日常工作中,集合的交併補運算最爲常見。例如:多個文件夾下的文件合併到一個文件夾、找出兩個文件夾內名稱相同、相異的文件。以以下兩個列表來進行實踐(lst_a 簡稱爲集合 A,lst_b 簡稱爲集合 B):

lst_a = [1,2,3,4,5]
lst_b = [3,4,5,6,7]

二 實踐過程

2.1 通過 Python 的推導式來實現

  • 求集合 A 與集合 B 的交集
lst_a = [1,2,3,4,5]
lst_b = [3,4,5,6,7]
lst_c = [x for x in lst_b if x in lst_a]
# lst_c = [x for x in lst_a if x in lst_b]
print(lst_c)

運行結果:

[3, 4, 5]
  • 求集合 A 與集合 B 的並集
lst_a = [1,2,3,4,5]
lst_b = [3,4,5,6,7]
lst_c = lst_a + [x for x in lst_b if x not in lst_a]
print(lst_c)

運行結果:

[1, 2, 3, 4, 5, 6, 7]
  • 集合 A 關於集合 B 的補集(B - A)
lst_a = [1,2,3,4,5]
lst_b = [3,4,5,6,7]
lst_c = [x for x in lst_b if x not in lst_a]
print(lst_c)

運行結果:

[6, 7]
  • 集合 B 關於集合 A 的補集(A - B)
lst_a = [1,2,3,4,5]
lst_b = [3,4,5,6,7]
lst_c = [x for x in lst_a if x not in lst_b]
print(lst_c)

運行結果:

[1, 2]

2.2 通過 Python 對集合的內置方法來實現

需要將列表轉換爲集合才能使用集合內置方法。

  • 求集合 A 與集合 B 的交集
lst_a = [1,2,3,4,5]
lst_b = [3,4,5,6,7]
set_a = set(lst_a)
set_b = set(lst_b)
set_c = set_a.intersection(lst_b)
print(list(set_c))

運行結果:

[3, 4, 5]
  • 求集合 A 與集合 B 的並集
lst_a = [1,2,3,4,5]
lst_b = [3,4,5,6,7]
set_a = set(lst_a)
set_b = set(lst_b)
set_c = set_a.union(set_b)
print(list(set_c))

運行結果:

[1, 2, 3, 4, 5, 6, 7]
  • 集合 B 關於集合 A 的補集(A - B)
lst_a = [1,2,3,4,5]
lst_b = [3,4,5,6,7]
set_a = set(lst_a)
set_b = set(lst_b)
set_c = set_a.difference(set_b)
print(list(set_c))

運行結果:

[1, 2]
  • 集合 A 關於集合 B 的補集(B - A)
lst_a = [1,2,3,4,5]
lst_b = [3,4,5,6,7]
set_a = set(lst_a)
set_b = set(lst_b)
set_c = set_b.difference(set_a)
print(list(set_c))

運行結果:

[6, 7]

2.3 通過 Python 按位運算來實現

需要將列表轉換爲集合才能使用集合內置方法。

  • 求集合 A 與集合 B 的交集
lst_a = [1,2,3,4,5]
lst_b = [3,4,5,6,7]
set_a = set(lst_a)
set_b = set(lst_b)
set_c = set_a & set_b
print(list(set_c))

運行結果:

[3, 4, 5]
  • 求集合 A 與集合 B 的並集
lst_a = [1,2,3,4,5]
lst_b = [3,4,5,6,7]
set_a = set(lst_a)
set_b = set(lst_b)
set_c = set_a | set_b
print(list(set_c))

運行結果:

[1, 2, 3, 4, 5, 6, 7]
  • 集合 B 關於集合 A 的補集(A - B)
lst_a = [1,2,3,4,5]
lst_b = [3,4,5,6,7]
set_a = set(lst_a)
set_b = set(lst_b)
set_c = set_a - set_b
print(list(set_c))

運行結果:

[1, 2]
  • 集合 A 關於集合 B 的補集(B - A)
lst_a = [1,2,3,4,5]
lst_b = [3,4,5,6,7]
set_a = set(lst_a)
set_b = set(lst_b)
set_c = set_b - set_a
print(list(set_c))

運行結果:

[6, 7]
  • 集合 A 與集合 B 的全集除去交集
lst_a = [1,2,3,4,5]
lst_b = [3,4,5,6,7]
set_a = set(lst_a)
set_b = set(lst_b)
set_c = set_b ^ set_a
print(list(set_c))

運行結果:

[1, 2, 6, 7]

三 總結

3.1 在處理類似集合的數據時,需要注意集合與列表的相互轉換,根據其特性,要會靈活使用;

3.2 集合的內置方法平時較少使用,但是使用起來還是比較方便的;

3.3 按位運算符在集合的運算中的應用簡潔明瞭,建議平時稍加註意;

3.4 Python 中的推導式在列表、集合、字典等多種數據結構中均適用,使用恰當時往往能事半功倍;

3.5 由於列表在實際使用中較爲常見,本文中的例子重點使用了列表來展示。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章