書名: Python從入門到精通作者名: 明日科技本章字數: 2728字更新時間: 2019-12-06 14:16:33
6.2 集合
Python中的集合(set)與數學中的集合概念類似,也是用于保存不重復的元素。它有可變集合(set)和不可變集合(frozenset)兩種。其中,本節所要介紹的set集合是無序可變序列,而另一種在本書中不做介紹。在形式上,集合的所有元素都放在一對大括號“{}”中,兩個相鄰元素間使用逗號“,”分隔。集合最好的應用就是去重,因為集合中的每個元素都是唯一的。
說明
在數學中,集合的定義是把一些能夠確定的不同的對象看成一個整體,而這個整體就是由這些對象的全體構成的集合。集合通常用大括號“{}”或者大寫的拉丁字母表示。
集合最常用的操作就是創建集合,以及集合的添加、刪除、交集、并集和差集等運算,下面分別進行介紹。
6.2.1 創建集合
在Python中提供了兩種創建集合的方法,一種是直接使用“{}”創建;另一種是通過set()函數將列表、元組等可迭代對象轉換為集合。筆者推薦使用第二種方法。下面分別進行介紹。
1.直接使用“{}”創建
在Python中,創建set集合也可以像列表、元組和字典一樣,直接將集合賦值給變量,從而實現創建集合,即直接使用大括號“{}”創建。語法格式如下:
setname = {element 1,element 2,element 3,...,element n}
其中,setname表示集合的名稱,可以是任何符合Python命名規則的標識符;element 1、element 2、element 3、element n表示集合中的元素,個數沒有限制,并且只要是Python支持的數據類型就可以。
注意
在創建集合時,如果輸入了重復的元素,Python會自動只保留一個。
例如,下面的每行代碼都可以創建一個集合。
01 set1 = {'水瓶座','射手座','雙魚座','雙子座'} 02 set2 = {3,1,4,1,5,9,2,6} 03 set3 = {'Python', 28, ('人生苦短', '我用Python')}
上面的代碼將創建以下集合。
{'水瓶座', '雙子座', '雙魚座', '射手座'} {1, 2, 3, 4, 5, 6, 9} {'Python', ('人生苦短', '我用Python'), 28}
說明
由于Python中的set集合是無序的,所以每次輸出時元素的排列順序可能與上面的不同,不必在意。
場景模擬:某大學的學生選課系統,可選語言有Python和C語言?,F創建兩個集合分別保存選擇Python語言的學生名字和選擇C語言的學生名字。
【例6.4】 創建保存學生選課信息的集合。(實例位置:資源包\TM\sl\06\04)
在IDLE中創建一個名稱為section_create.py的文件,然后在該文件中定義兩個包括4個元素的集合,再輸出這兩個集合,代碼如下:

運行代碼后,將顯示如圖6.7所示的結果。

圖6.7 創建集合
2.使用set()函數創建
在Python中,可以使用set()函數將列表、元組等其他可迭代對象轉換為集合。set()函數的語法格式如下:
setname = set(iteration)
參數說明如下:
setname:表示集合名稱;
iteration:表示要轉換為集合的可迭代對象,可以是列表、元組、range對象等。另外,也可以是字符串,如果是字符串,返回的集合將是包含全部不重復字符的集合。
例如,下面的每行代碼都可以創建一個集合。
01 set1 = set("命運給予我們的不是失望之酒,而是機會之杯。") 02 set2 = set([1.414,1.732,3.14159,2.236]) 03 set3 = set(('人生苦短', '我用Python'))
上面的代碼將創建以下集合。
{'不', '的', '望', '是', '給', ',', '我', '。', '酒', '會', '杯', '運', '們', '予', '而', '失', '機', '命', '之'} {1.414, 2.236, 3.14159, 1.732} {'人生苦短', '我用Python'}
從上面創建的集合結果中可以看出,在創建集合時,如果出現了重復元素,那么將只保留一個,例如在第一個集合中的“是”和“之”都只保留了一個。
注意
在創建空集合時,只能使用set()實現,而不能使用一對大括號“{}”實現,這是因為在Python中,直接使用一對大括號“{}”表示創建一個空字典。
下面將實例6.4修改為使用set()函數創建保存學生選課信息的集合。修改后的代碼如下:

執行結果如圖6.7所示。
說明
在Python中,創建集合時推薦采用set()函數實現。
6.2.2 向集合中添加和刪除元素
集合是可變序列,所以在創建集合后,還可以對其添加或者刪除元素。下面分別進行介紹。
1.向集合中添加元素
向集合中添加元素可以使用add()方法實現。它的語法格式如下:
setname.add(element)
其中,setname表示要添加元素的集合;element表示要添加的元素內容。這里只能使用字符串、數字及布爾類型的True或者False等,不能使用列表、元組等可迭代對象。
例如,定義一個保存明日科技零基礎學系列圖片名字的集合,然后向該集合中添加一個剛剛上市的圖書名字,代碼如下:
01 mr = set(['零基礎學Java','零基礎學Android','零基礎學C語言','零基礎學C#','零基礎學PHP']) 02 mr.add('零基礎學Python') # 添加一個元素 03 print(mr)
上面的代碼運行后,將輸出以下集合。
{'零基礎學PHP', '零基礎學Android', '零基礎學C#', '零基礎學C語言', '零基礎學Python', '零基礎學Java'}
2.從集合中刪除元素
在Python中,可以使用del命令刪除整個集合,也可以使用集合的pop()方法或者remove()方法刪除一個元素,或者使用集合對象的clear()方法清空集合,即刪除集合中的全部元素,使其變為空集合。
例如,下面的代碼將分別實現從集合中刪除指定元素、刪除一個元素和清空集合。

上面的代碼運行后,將輸出以下內容。
使用remove()方法移除指定元素后: {'零基礎學Android', '零基礎學PHP', '零基礎學C語言', '零基礎學Java', '零 基礎學C#'} 使用pop()方法移除一個元素后: {'零基礎學PHP', '零基礎學C語言', '零基礎學Java', '零基礎學C#'} 使用clear()方法清空集合后: set()
注意
使用集合的remove()方法時,如果指定的內容不存在,將拋出如圖6.8所示的異常。所以在移除指定元素前,最好先判斷其是否存在。要判斷指定的內容是否存在,可以使用in關鍵字實現。例如,使用“'零語'in c”可以判斷在c集合中是否存在“零語”。

圖6.8 從集合中移除的元素不存在時拋出異常
場景模擬:仍然是某大學的學生選課系統,聽說連小學生都學Python,“零語”同學決定放棄學習C語言,改為學習Python。
【例6.5】 學生更改所選課程。(實例位置:資源包\TM\sl\06\05)
在IDLE中創建一個名稱為section_add.py的文件,然后在該文件中定義一個包括4個元素的集合,并且應用add()函數向該集合中添加一個元素,再定義一個包括4個元素的集合,并且應用remove()方法從該集合中刪除指定的元素,最后輸出這兩個集合,代碼如下:

運行代碼后,將顯示如圖6.9所示的結果。

圖6.9 向集合中添加和刪除元素
6.2.3 集合的交集、并集和差集運算
集合最常用的操作就是進行交集、并集、差集和對稱差集運算。進行交集運算時使用“&”符號;進行并集運算時使用“|”符號;進行差集運算時使用“-”符號,進行對稱差集運算時使用“^”符號。下面通過一個具體的實例演示如何對集合進行交集、并集和差集運算。
場景模擬:仍然是某大學的學生選課系統,學生選課完畢后,老師要對選課結果進行統計。這時,需要知道哪些學生既選擇了Python語言又選擇了C語言,參與選課的全部學生,以及選擇了Python語言但沒有選擇C語言的學生。
【例6.6】 對選課集合進行交集、并集和差集運算。(實例位置:資源包\TM\sl\06\06)
在IDLE中創建一個名稱為section_operate.py的文件,然后在該文件中定義兩個包括4個元素的集合,再根據需要對兩個集合進行交集、并集和差集運算,并輸出運算結果,代碼如下:

在上面的代碼中,為了獲取既選擇了Python語言又選擇C語言的學生名字,對兩個集合進行交集運算;為了獲取參與選課的全部學生名字,對兩個集合進行并集運算;為了獲取選擇了Python語言但沒有選擇C語言的學生名字,對兩個集合進行差集運算。
運行代碼后,將顯示如圖6.10所示的結果。

圖6.10 對選課集合進行交集、并集和差集運算
- C語言程序設計教程
- Python科學計算(第2版)
- Objective-C Memory Management Essentials
- Java編程指南:基礎知識、類庫應用及案例設計
- 我的第一本算法書
- NativeScript for Angular Mobile Development
- 從0到1:HTML+CSS快速上手
- INSTANT Mercurial SCM Essentials How-to
- Visual Basic程序設計實驗指導(第4版)
- PLC編程及應用實戰
- Bootstrap 4:Responsive Web Design
- UML 基礎與 Rose 建模案例(第3版)
- Node.js Design Patterns
- Swift 4 Protocol-Oriented Programming(Third Edition)
- 零基礎輕松學C++:青少年趣味編程(全彩版)