python3 第十五章,python3
python的官網裡對集合的描述是:
Python also includes a data type for sets. A set is an unordered collection with no duplicate elements. Basic uses include membership testing and eliminating duplicate entries. Set objects also support mathematical operations like union, intersection, difference, and symmetric difference.
Python還包括用於集合的資料類型。集合是沒有重複元素的無序容器。基本用法包括成員資格測試和消除重複條目。集合對象也支援數學運算,如並,交,差和對稱差。
特點:
- 集合是一個無序的,不重複的資料群組合
- 把一個列表變成集合,就自動去重了
- 關係測試,測試兩組資料之前的交集、差集、並集等關係
1、建立
用花括弧或者set()函數可以用來建立集合。注意,你必須使用set()建立一個空的集合,而不能用{},後面這種寫法建立一個空的字典
執行個體:
basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'} # 用花括弧的方式建立一個集合set2 = set('abracadabra') # 用set()的方式建立一個集合set3 = set() # 建立一個空的集合print(basket)
以上代碼,輸出:
{'banana', 'orange', 'apple', 'pear'}
細心對照一下,你會發現,自動去除了重複,值得一提的是顯示的順序並不表示Sets是有序的
2、添加元素
通過add(key)方法可以添加元素到set中,可以重複添加,但不會有效果:
basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'} # 用花括弧的方式建立一個集合print('原來的basket:', basket)basket.add('apple') # 添加一個重複的print('添加一個重複項後:', basket)basket.add('watermelon') # 添加一個不重複的print('添加一個不重複項後:', basket)
以上代碼,輸出:
原來的basket: {'apple', 'banana', 'pear', 'orange'}添加一個重複項後: {'apple', 'banana', 'pear', 'orange'}添加一個不重複項後: {'banana', 'apple', 'watermelon', 'orange', 'pear'}
3、刪除元素
可通過remove(key)方法可以刪除元素:
basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'} # 用花括弧的方式建立一個集合print('原來的basket:', basket)basket.remove('apple') # 刪除 'apple'print('刪除 \'apple\':', basket)
以上代碼,輸出:
原來的basket: {'apple', 'pear', 'banana', 'orange'}刪除 'apple': {'pear', 'banana', 'orange'}
set和dict的唯一區別僅在於沒有儲存對應的value,但是,set的原理和dict一樣,所以,同樣不可以放入可變對象,因為無法判斷兩個可變對象是否相等,也就無法保證set內部“不會有重複元素”。試試把list放入set,看看是否會報錯。
set可以看成數學意義上的無序和無重複元素的集合,因此,兩個set可以做數學意義上的交集、並集等操作,我們通過執行個體來示範:
A = {'apple', 'orange', 'pear', 'banana'} # 用花括弧的方式建立一個集合B = {'apple', 'orange', 'watermelon'}C = {'apple', 'orange'}D = {'c++', 'python'}print('集合A:', A)print('集合B:', B)print('A、B的交集:', A.intersection(B)) # 交集print('A、B的並集:', A.union(B)) # 並集print('A、B的差集:', A.difference(B)) # 差集 (項在A中,但不在B中)print('A、B的對稱差集:', A.symmetric_difference(B)) # 對稱差集(項在A或B中,但不會同時出現在二者中)# 子集(判斷A是否包含了B裡面的所有值)print('B是A的子集?', B.issubset(A))print('C是A的子集?', C.issubset(A))# 父集(判斷A是否為B的父集)print('A是B的父集?', A.issuperset(B))print('A是C的父集?', A.issuperset(C))# 無交集(判斷兩個集合是否完全沒有任何交集)print('A與D是否有交集?', A.isdisjoint(D))print('A與B是否有交集?', A.isdisjoint(B))print() # 輸出空行print() # 輸出空行print('另一種寫法')print('集合A:', A)print('集合B:', B)# 另一種寫法print('A、B的交集 => A & B:', A & B) # 交集print('A、B的並集 => A | B:', A | B) # 並集print('A、B的差集 => A - B:', A - B) # 差集(項在A中,但不在B中)print('A、B的對稱差集 => A ^ B:', A ^ B) # 對稱差集(項在A或B中,但不會同時出現在二者中)
以上代碼,輸出:
集合A: {'apple', 'orange', 'pear', 'banana'}集合B: {'apple', 'orange', 'watermelon'}A、B的交集: {'apple', 'orange'}A、B的並集: {'apple', 'watermelon', 'pear', 'orange', 'banana'}A、B的差集: {'pear', 'banana'}A、B的對稱差集: {'watermelon', 'pear', 'banana'}B是A的子集? FalseC是A的子集? TrueA是B的父集? FalseA是C的父集? TrueA與D是否有交集? TrueA與B是否有交集? False另一種寫法集合A: {'apple', 'orange', 'pear', 'banana'}集合B: {'apple', 'orange', 'watermelon'}A、B的交集 => A & B: {'apple', 'orange'}A、B的並集 => A | B: {'apple', 'watermelon', 'pear', 'orange', 'banana'}A、B的差集 => A - B: {'pear', 'banana'}A、B的對稱差集 => A ^ B: {'watermelon', 'pear', 'banana'}