天天看點

8. ㊙ Python 集合三闆斧,滾雪球學 Python八、Python 中一個無序且元素唯一的資料類型,它是集合。

學程式設計要簡單、粗暴。更要有效,很多時候學的越多,忘得越快。但程式設計總有那麼一天頓悟的時候,而頓悟的契機目前就是建立在你跟橡皮擦堅持打卡 100 天,在評論區堅持跟橡皮擦卡學習的朋友,在 100 天之後,橡皮擦将送出

神秘大獎

已完成的文章

八、Python 中一個無序且元素唯一的資料類型,它是集合。

8.1 集合是啥

集合是一個資料類型,它其中的每個元素的順序不固定,但唯一。多麼繞的一句話,回味,一定要好好回味。

集合中的元素内容必須是不可變類型,例如整數、浮點數、字元串、元組等内容,可變的清單、字典、集合不可以。

集合本身是可變的,跟清單一樣可以增删元素。

8.1.1 集合的聲明

截止到現在,小括号用來聲明元組,中括号用來聲明清單,大括号用來聲明字典,那集合怎麼辦?Python 中也是用大括号來聲明集合。當然你也可以通過

set

函數建立集合。

集合定義的文法格式如下:

my_set = {元素1,元素2,...}           

簡單的代碼示例如下:

my_set = {1, 2, 3, 3, 10, 4, 5, 6}

print(my_set)           

資料輸出之後,會發現重複的整數 3 隻剩下一個了。還是因為集合的元素是唯一的,出現重複多的部分将會舍去。

如果在集合中使用了可變類型作為元素,會報錯。

my_set = {1, 2, 3, [3, 10, 4, 5, 6]}
# 錯誤提示:TypeError: unhashable type: 'list'
print(my_set)           

這裡需要注意下,空集合的聲明不能使用

{}

,隻用一個大括号表示的是空字典。聲明一個空集合需要用到

set

函數。

8.1.2 set 函數定義集合

使用 set 函數可以定義集合,并且可以定義空集合。set 函數參數可以為字元串、清單、元組。

通過 set 定義空集合

my_dict = {}
my_set = set()

# 空字典
print(type(my_dict))
# 空集合
print(type(my_set))           

set 将字元串轉換成集合

set 函數類似一個強制轉換,可以将其它類型的轉換成集合。

my_set = set("my name is xiangpica")
print(my_set)           

該内容會過濾重複字母,并且輸出的順序不定,因為集合是無序的。

集合可以對元組去重

借助集合元素的不允許重複,可以實作一些特定的效果,例如去重。

my_tuple = ("apple", "orange", "orange", "pear", "banana", "food")
my_set = set(my_tuple)
print(my_set)           

8.2 集合的操作

在學集合相關操作前,需要在學習一些符号。

符号 含義
& 交集
\ 并集
- 差集
^ 對稱差集

接下來的内容就非常類似高中線代裡面的概念了,求集合的交并差集。

8.2.1 交集(intersection)

交集就是求兩個集合共有的元素。

my_set1 = {"apple", "orange", "pear", "banana", "food"}
my_set2 = {"apple", "orange", "pear"}

both = my_set1 & my_set2
print(both)           

除了通過

&

符号以外,還可以通過集合的

intersection

方法完成。

my_set1 = {"apple", "orange", "pear", "banana", "food"}
my_set2 = {"apple", "orange", "pear"}

both = my_set1.intersection(my_set2)
print(both)           

8.2.2 并集(union)

并集就是取所有集合的所有元素,如果出現重複的保留一個。使用符号

|

或者 union 方法完成。

my_set1 = {"apple", "orange", "pear", "banana", "food"}
my_set2 = {"apple", "orange", "pear"}

both = my_set1 | my_set2
print(both)           

使用 union 完成。

my_set1 = {"apple", "orange", "pear", "banana", "food"}
my_set2 = {"apple", "orange", "pear"}

both = my_set1.union(my_set2)
print(both)           

8.2.3 差集(difference)

對于求集合的差集與交并集不同,有個先後順序問題,例如屬于 A 但不屬于 B 表示為 A-B,同理屬于 B 但不屬于 A,表示為 B-A。

差集的符号是

-

,可以使用 difference 方法進行運算。

my_set1 = {"apple", "orange", "pear", "banana", "food"}
my_set2 = {"apple", "orange", "pear", "grape"}
# 求解屬于 A,但不屬于 B 的元素
dif1 = my_set1 - my_set2
print(dif1)
# 求解屬于 B,但不屬于 A 的元素
dif2 = my_set2 - my_set1
print(dif2)           

接下來如何使用

difference

方法去求差集就交給你自己完成啦。

8.2.4 對稱差集(symmetric difference)

A 與 B 兩個集合,如果想要獲得屬于 A 或者 B 集合的元素,但又不要屬于 A 且屬于 B 的元素,這時就是對稱差集的應用場景了。

對稱差集的符号是

^

,方法名是

symmetric_difference

my_set1 = {"apple", "orange", "pear", "banana", "food"}
my_set2 = {"apple", "orange", "pear", "grape"}

dif = my_set1 ^ my_set2
print(dif)           

上述代碼就會輸出既不屬于 A 也不屬于 B 的元素,即對稱差集。

8.3 集合的方法

8.3.1 集合的增删

add 方法可以在集合中增加元素,文法格式如下:

my_set.add(新增元素)           

第一個需要注意的新的元素如果已經存在集合中,不會新增進去,第二個需要注意的是集合是無序的,新增加元素的位置将不确定。

my_set = {"apple", "orange", "pear", "grape"}
my_set.add("new")
my_set.add("new")
print(my_set)           

remove 方法可以删除集合中元素,前提是該元素在集合中,如果删除不存在的元素報錯。

my_set = {"apple", "orange", "pear", "grape"}

my_set.remove("apple")

print(my_set)
# 第二次删除報錯 因為 apple 已經不在集合中
my_set.remove("apple")
print(my_set)           

discard 方法可以删除集合元素,如果元素不存在不會報錯。

my_set = {"apple", "orange", "pear", "grape"}

my_set.discard("apple")
print(my_set)

my_set.discard("apple")
print(my_set)           

pop 方法為随機删除一個元素,被删除的元素會被傳回,即可以用一個變量接收被删除的元素,如果集合為空使用 pop 會報錯。

my_set1 = {"apple", "orange", "pear", "grape"}

# pop 方法随機删除一個元素,将被删除的元素傳回
var = my_set1.pop()
print(var)

# 空集合使用 pop 方法報錯
my_set2 = set()
var = my_set2.pop()
print(var)           

clear 方法删除集合内的所有元素

my_set1 = {"apple", "orange", "pear", "grape"}

my_set1.clear()
print(my_set1)           

8.3.1 集合的其它方法

isdisjoint 方法用于判斷兩個集合是否存在相同元素,沒有傳回 True,否則傳回 False。

my_set1 = {"apple", "orange", "pear", "grape"}
my_set2 = {"banana", "watermelon"}

# 兩個集合沒有相同元素
ret_bool = my_set1.isdisjoint(my_set2)
print(ret_bool) # 傳回 True

my_set1 = {"apple", "orange", "pear", "grape"}
my_set2 = {"banana", "watermelon","apple"}

# 兩個集合有相同元素
ret_bool = my_set1.isdisjoint(my_set2)
print(ret_bool)           

issubset 該方法用于判斷一個集合是否是另一個集合的子集,确定是傳回 True,否則傳回 False。

my_set1 = {"apple", "orange", "pear", "grape"}
my_set2 = {"banana", "watermelon"}

# 第二個集合不是第一個集合的子集
ret_bool = my_set2.issubset(my_set1)
print(ret_bool) # 傳回 False

# 第二個集合是第一個集合的子集
my_set1 = {"apple", "orange", "pear", "grape"}
my_set2 = {"orange","apple"}

ret_bool = my_set2.issubset(my_set1)
print(ret_bool) # 傳回 True           

注意判斷 A 是 B 的子集,格式是

A.issubset(B)

,順序别搞錯。

issuperset 方法用于判斷一個集合是否是另一個集合的父集,與 issubset 恰好相反,具體實作由大家自行完成。

update 方法用于将一個集合的元素添加到另一個集合内,文法格式如下:

被添加的集合A.update(待添加的集合B)           

該方法誰在前就是給誰添加。

my_set1 = {"apple", "orange", "pear", "grape"}
my_set2 = {"banana", "watermelon"}

my_set1.update(my_set2)
print(my_set1)           

其它一些方法,本輪滾雪球階段隻做了解。

  • intersection_update 此方法用于求多個集合的交集
  • difference_update 删除集合内與另一集合重複的元素
  • symmetric_difference_update 類似對稱差集的用法

8.4 集合可用的内置函數

8.4.1 max、min、sum

以上内置函數作用域集合與清單使用規則一緻,自行測試即可。

8.4.2 len

擷取集合元素的數量。

8.4.3 sorted

使用該函數可以對集合進行排序。

8.5 當機集合 frozenset

集合中的元素可以添加與删除,與清單可以對應。

還存在一種不可進行添加與删除元素的集合,叫做當機集合,與元組可以對應學習。

當機集合不做展開講解,有興趣的可以檢索一些,不過我覺得這節課内容已經非常多啦。

8.6 這篇部落格的總結

集合,一個無序且元素必須唯一的容器型資料類型,在橡皮擦的程式設計生涯中,集合經常用來去重,效率高、編寫簡單,值得掌握。

下篇部落格開始,我們将進入 Python 函數的世界,難度要來了哦~

最後一碗毒雞湯

當你學會破罐破摔 你會發現這世界豁然開朗 O(∩_∩)O 哈哈~

🍂🍂🍂🍂🍂🍂🍂

今天是持續寫作的第 7 / 100 天。

如果你有想要交流的想法、技術,歡迎在評論區留言。