學程式設計要簡單、粗暴。更要有效,很多時候學的越多,忘得越快。但程式設計總有那麼一天頓悟的時候,而頓悟的契機目前就是建立在你跟橡皮擦堅持打卡 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 天。
如果你有想要交流的想法、技術,歡迎在評論區留言。