天天看點

三種方式實作 Python 中的集合的交、并、補運算三種方式實作 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或AB,即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 對集合的内置方法來實作

需要将清單轉換為集合才能使用集合内置方法。

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]           
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]           
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]           
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 按位運算來實作

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]           
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]           
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]           
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 由于清單在實際使用中較為常見,本文中的例子重點使用了清單來展示。