1. Python的集合 1.1 集合的定義 在Python中, 集合set是基本數據類型的一種集合類型,它有可變集合(set())和不可變集合(frozenset)兩種。Python中的集合set類似列表,但每個元素都必須時獨一無二的,無序的。 集合set是無序的、不重覆的,是可變的,有add() ...
1. Python的集合
1.1 集合的定義
在Python中, 集合set是基本數據類型的一種集合類型,它有可變集合(set())和不可變集合(frozenset)兩種。Python中的集合set類似列表,但每個元素都必須時獨一無二的,無序的。
集合set是無序的、不重覆的,是可變的,有add(),remove()等方法。由於集合set是可變的,所以它不存在哈希值。基本功能包括關係測試和消除重覆元素。集合對象還支持union(聯合)、 intersection(交集)、 difference(差集)和sysmmetric difference(對稱差集)等數學運算。
集合set支持 N in set, len(set),和 for N in set。作為一個無序的集合,集合set不記錄元素位置或者插入點。因此,集合set不支持 indexing, 或其它類序列的操作。
集合frozenset()是凍結的集合,它是不可變的,存在哈希值,優點是它可以作為字典的key,也可以作為其它集合的元素。缺點是一旦創建便不能更改,沒有add(),remove()方法。
因此,Python中集合的作用主要是:去重,把一個列表變成集合,就自動去重;關係測試,測試兩組數據之間的交集、差集、並集等關係。
1.2 集合的操作
在Python中,集合set的常用操作包括:創建集合set、集合set增加、集合set刪除、集合的交集、集合的並集、集合的差集等。
1.2.1 集合的創建
在Python中,集合的創建可以使用集合的工廠函數set()和frozenset(),但是,set()創建的集合時可變的,frozenset()創建的集合時不可變的,其語法格式分別如下:
集合名 = set(集合值)
集合名 = frozenset(集合值)
(1)創建空集合
在Python中,當不指定集合的值時,使用工廠函數set()和frozenset()即可創建一個空集合。
例如,創建空集合。
代碼:
1 a =set() 2 b = frozenset() 3 print(a) 4 print(b)
運行結果:
1 set() 2 frozenset()
(2)用set()方法創建集合
例如,用set()方法創建一個0到10之間的奇數的集合,並列印出來。
代碼:
1 number_odd = [] 2 for number in range(1,11,2): 3 number_odd.append(number) 4 number_opp_set =set(number_odd) 5 print(number_opp_set)
說明:
第1行,創建一個空列表。
第2~3行,用函數range()迴圈生成0到10之間的奇數,然後增加到空列表中。
第4行,將列表中的值傳給方法set(),生成一個集合。
運行結果:
1 {1, 3, 5, 7, 9}
以上的代碼可以通過列表解析的方式優化為:
代碼1:
1 number_opp_set =set(number for number in range(1,11,2)) 2 print(number_opp_set)
說明:
因為Python是解釋性語言,代碼越少,解釋花費的時間也少。
運行結果1:
1 {1, 3, 5, 7, 9}
(3)用frozenset()方法創建集合
例如,用frozenset()方法創建一個0到10之間的奇數的集合,並列印出來。
代碼:
1 number_opp_set_0 =frozenset(number for number in range(1,11,2)) 2 print(number_opp_set_0)
運行結果:
1 frozenset({1, 3, 5, 7, 9})
1.2.2 集合的增加
在python中,集合的增加有兩種常用方法:add()方法和update()方法。
(1) add()方法
集合的add()方法是把要傳入的元素做為一個整體增加到集合中,即實現單元素增加。
例如,定義一個0到10的奇數的集合,然後再用add()方法往裡面增加一個偶數2和18,然後再列印出來。
代碼:
1 number_opp_set =set(number for number in range(1,11,2)) 2 print(number_opp_set) 3 number_opp_set.add(2) 4 number_opp_set.add(18) 5 print(number_opp_set)
說明:
第3、4行,都是時使用add()方法分別向集合中增加偶數2和18。
運行結果:
1 {1, 3, 5, 7, 9} 2 {1, 2, 3, 5, 7, 9, 18}
(2)update()方法
集合update()方法是把要傳入的元素拆分,做為單個個體增加到集合中,即多元素增加。
例如,定義一個0到10的奇數的集合,然後再用update()方法往裡面增加一個偶數2和18,然後再列印出來。
代碼:
1 number_opp_set =set(number for number in range(1,11,2)) 2 print(number_opp_set) 3 number_opp_set.update('2') 4 number_opp_set.update('18') 5 print(number_opp_set)
說明:
第3、4行,分別調用update()方法分別向集團中增加偶數2和18.
運行結果:
1 {1, 3, 5, 7, 9} 2 {1, 3, 5, 7, 9, '2', '8', '1'}
從以上的運行結果中可知,偶數18倍拆分為1和8分別增加到集合中,並且增加的值都被單引號引起來,這表示增加的是字元竄。這並不是我們需要的結果。
在Python中,如果調用update()方法向集合中增加兩個或多個字元組成的值時,該值需要使用中括弧或者花括弧括起來,即表示為字典或列表的形式。
例如,定義一個0到10的奇數的集合,然後再用update()方法往裡面增加一個偶數2和18,即奇數19,然後再列印出來。
代碼:
1 number_opp_set =set(number for number in range(1,11,2)) 2 print(number_opp_set) 3 number_opp_set.update('2') 4 number_opp_set.update(['18']) 5 number_opp_set.update({'19'}) 6 print(number_opp_set)
運行結果:
1 {1, 3, 5, 7, 9} 2 {1, 3, 5, 7, 9, '18', '2', '19'}
1.2.3 集合的刪除
在Python中,集合的刪除分為兩種,一種是刪除集合中的值;一種是刪除整個集合。
(1)刪除整個集合
在Python中,當我們需要刪除整個集合中時,可使用del 語句直接刪除。
例如,將1.2.2 中創建的集合刪除。
代碼:
1 number_opp_set =set(number for number in range(1,11,2)) 2 print("集合刪除前:",number_opp_set) 3 del number_opp_set 4 print("集合刪除後:",number_opp_set)
說明:
第2行,使用del語句刪除集合number_opp_set。
運行結果:
1 集合刪除前: {1, 3, 5, 7, 9} 2 Traceback (most recent call last): 3 File "F:/PyProject/s14/day2/test_set.py", line 6, in <module> 4 print("集合刪除後:",number_opp_set) 5 NameError: name 'number_opp_set' is not defined
從以上的運行結果可知,使用del語句刪除集合時一種永久性的,刪除後就集合就不能再被使用。
(2)刪除集合中的值
在Python中,當我們需要刪除集合中的值時,可使用remove()方法。
例如,將1.2.2 中增加到集合中的值刪除。
代碼:
1 number_opp_set =set(number for number in range(1,11,2)) 2 print(number_opp_set) 3 number_opp_set.update('2') 4 number_opp_set.update(['18']) 5 number_opp_set.update({'19'}) 6 print(number_opp_set) 7 number_opp_set.remove('2') 8 number_opp_set.remove('18') 9 number_opp_set.remove('19') 10 print(number_opp_set)
說明:
第7、8、9行,分別調用remove()方法分別從集合中刪除前面增加到集合中的值,並且remove中的參數必須用引號引起來,否則Python解釋器無法解析,會提示錯誤。
運行結果:
1 {1, 3, 5, 7, 9} 2 {1, 3, 5, 7, '18', 9, '2', '19'} 3 {1, 3, 5, 7, 9}
1.2.3 集合的訪問
在Python中,集合的訪問主要有兩種,一種是訪問整個集合,一種的集合的遍歷。
(1)訪問整個集合
在Python中,訪問整個集合,可以直接使用。
例如,創建一個1到10之間的數字組成的偶數的集合,並訪問整個集合。
代碼:
1 number_even_set =set(number for number in range(2,11,2)) 2 print(number_even_set)
說明:
第1行,使用range()函數和for迴圈,從2開始,依次遍歷到10,且步長為2,再用set()方法,將所有遍歷過程中滿足步長為2的數字創建為一個集合。
第2行,直接用print列印整個集合。
運行結果:
1 {2, 4, 6, 8, 10}
(2)訪問集合中的每個值
在Python中,我們可以使用for迴圈來遍歷訪問集合中的每個值。
例如,創建一個1到10之間的數字組成的偶數的集合,並遍歷訪問集合中的每個值。
代碼:
1 number_even_set =set(number for number in range(2,11,2)) 2 print(number_even_set) 3 for number_evven in number_even_set: 4 print(number_evven)
運行結果:
1 {2, 4, 6, 8, 10} 2 2 3 4 4 6 5 8 6 10
1.3 集合的關係測試
在Python中,集合的關係測試包括:並集、交集、差集等等。
1.3.1 並集
集合中,並集也叫合集,即將一個集合和另一個集合合併為一個集合的過程。求並集使用函數union()。
例如,創建一個1到10之間的數字組成的偶數的集合和奇數集合,然後求其並集。
代碼:
1 number_opp_set =set(number for number in range(1,11,2)) 2 print(number_opp_set) 3 number_even_set =set(number for number in range(2,11,2)) 4 print(number_even_set) 5 number_set = number_opp_set.union(number_even_set) 6 print(number_set)
說明:
第5行,用函數union()將集合number_opp_set和集合number_even_set合併後賦值給變數number_set。
運行結果:
1 {1, 3, 5, 7, 9} 2 {2, 4, 6, 8, 10} 3 {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
從以上的運行結果可知,通過函數union()將兩個集合合併為一個集合。
1.3.2 交集
交集就是兩個集合中都有的部分,用函數intersection()求兩個集合的交集。
例如,創建一個1到5的數字組成的集合,再創建一個0到10的奇數組成的集合,然後求其交集。
代碼:
1 number_set_a =set(number for number in range(1,6)) 2 print(number_set_a) 3 number_opp_set =set(number for number in range(1,11,2)) 4 print(number_opp_set) 5 number_set = number_set_a.intersection(number_opp_set) 6 print(number_set)
說明:
第5行,使用函數intersection()求集合number_set_a和集合number_opp_set的交集。
運行結果:
1 {1, 2, 3, 4, 5} 2 {1, 3, 5, 7, 9} 3 {1, 3, 5}
從以上的運行結果可知,通過函數intersection()已經把兩個集合的公共部分求出來了。
1.3.3 差集
差集就是在兩個集合中,在集合a中有,但集合b中沒有的部分,或者集合b中有,但集合a中沒有的部分。
例如,創建一個1到5的數字組成的集合,再創建一個0到10的奇數組成的集合,然後求其差集。
代碼:
1 number_set_a =set(number for number in range(1,6)) 2 print(number_set_a) 3 number_opp_set =set(number for number in range(1,11,2)) 4 print(number_opp_set) 5 number_set = number_set_a.difference(number_opp_set) 6 print(number_set) 7 _number_set = number_opp_set.difference(number_set_a) 8 print(_number_set)
說明:
第5行,使用函數difference()求集合number_set_a中有,但集合number_opp_set中沒有的部分,並賦值給變數number_set。
第7行,使用函數difference()求集合number_opp_set中有,但集合number_set_a中沒有的部分,並賦值給變數_number_set。
運行結果:
1 {1, 2, 3, 4, 5} 2 {1, 3, 5, 7, 9} 3 {2, 4} 4 {9, 7}
1.3.4 子集
判斷集合a是否是集合b的子集,使用函數issubset()。
例如,創建一個1到10的數字組成的集合,再創建一個0到10的奇數組成的集合,然後求其子集。
代碼:
1 number_set_a =set(number for number in range(1,11)) 2 print(number_set_a) 3 number_opp_set =set(number for number in range(1,11,2)) 4 print(number_opp_set) 5 number_set = number_set_a.issubset(number_opp_set) 6 print(number_set) 7 _number_set = number_opp_set.issubset(number_set_a) 8 print(_number_set)
說明:
第5行,判斷集合number_set_a是否是集合number_opp_set的子集,判斷結果賦值給變數number_set。
第7行,判斷集合number_opp_set是否是集合number_set_a的子集,判斷結果賦值給變數_number_set。
運行結果:
1 {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} 2 {1, 3, 5, 7, 9} 3 False 4 True
1.3.5 父集
判斷集合a是否是集合b的父集,使用函數issuperset()。
例如,創建一個1到10的數字組成的集合,再創建一個0到10的奇數組成的集合,然後求其父集。
代碼:
1 number_set_a =set(number for number in range(1,11)) 2 print(number_set_a) 3 number_opp_set =set(number for number in range(1,11,2)) 4 print(number_opp_set) 5 number_set = number_set_a.issuperset(number_opp_set) 6 print(number_set) 7 _number_set = number_opp_set.issuperset(number_set_a) 8 print(_number_set)
說明:
第5行,判斷集合number_set_a是否是集合number_opp_set的父集,判斷結果賦值給變數number_set。
第7行,判斷集合number_opp_set是否是集合number_set_a的父集,判斷結果賦值給變數_number_set。
運行結果:
1 {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} 2 {1, 3, 5, 7, 9} 3 True 4 False
1.3.5 對稱差集
對稱差集就是求兩個集合中的剔除公共的部分的集合。
例如,創建一個1到5的數字組成的集合,再創建一個0到10的奇數組成的集合,然後求其對稱差集。
代碼:
1 number_set_a =set(number for number in range(1,6)) 2 print(number_set_a) 3 number_opp_set =set(number for number in range(1,11,2)) 4 print(number_opp_set) 5 number_set = number_set_a.symmetric_difference(number_opp_set) 6 print(number_set) 7 _number_set = number_opp_set.symmetric_difference(number_set_a) 8 print(_number_set)
說明:
第5行,使用函數symmetric_difference()求集合number_set_a和集合number_opp_set的對稱差集,並賦值給變數number_set。
第7行,使用函數symmetric_difference()求集合number_opp_set和集合number_set_a的對稱差集,並賦值給變數_number_set。
運行結果:
1 {1, 2, 3, 4, 5} 2 {1, 3, 5, 7, 9} 3 {2, 4, 7, 9} 4 {2, 4, 7, 9}
從以上的運行結果可知,求兩個集合的對稱差集時,哪個集合寫在函數中都行,其結果都一樣。