# 集合 Set
`Set`和字典一樣用`{ }`表示,不同的是其元素不是鍵值對,而是一個無序的不重復元素序列。
集合更接近數學上集合的概念,可以通過集合判斷數據的從屬關系,也可以通過集合把數據結構中重復的元素減掉。集合可做集合運算,可添加和刪除元素。
## 特點
* 元素無序且不重復
* 可做集合運算
## 基礎操作
```python
print('創建一個空集合必須用set()函數,因為如果直接用{}是用來創建一個空字典的:set():', set())
print('將一個字符串轉為集合set(Str):', set('Tommy'))
list = ['play', 'algorithm', 'python', 2019, 5.11, 'python']
# 集合中元素無序且不重復,python將只會留下一個
set1 = set(list)
print('將一個列表轉為集合 set(list):', set1)
# 判斷元素是否在集合內
print("python是否在集合內 'python' in set1:", 'python' in set1)
# 迭代
print('迭代set :')
for item in set1:
print(item)
# 集合運算
set2 = {1, 2, 3, 4, 5, 6}
set3 = {1, 2, 7, 8}
print('減法,set2中包含但set3中不包含的元素 set2 - set3:', set2 - set3)
print('按位或運算,set2和set3中包含的所有元素 set2 | set3:', set2 | set3)
print('按位與運算,set2和set3中都包含的元素 set2 & set3:', set2 & set3)
print('按位異或運算,set2和set3中不同時包含的元素 set2 ^ set3:', set2 ^ set3)
```
**輸出結果**
```
創建一個空集合必須用set()函數,因為如果直接用{}是用來創建一個空字典的:set(): set()
將一個字符串轉為集合: {'y', 'o', 'T', 'm'}
將一個列表轉為集合: {'algorithm', 2019, 5.11, 'python', 'play'}
python是否在集合內 'python' in set1: True
迭代set :
algorithm
2019
5.11
python
play
減法,set2中包含但set3中不包含的元素 set2 - set3: {3, 4, 5, 6}
按位或運算,set2和set3中包含的所有元素 set2 | set3: {1, 2, 3, 4, 5, 6, 7, 8}
按位與運算,set2和set3中都包含的元素 set2 & set3: {1, 2}
按位異或運算,set2和set3中不同時包含的元素 set2 ^ set3: {3, 4, 5, 6, 7, 8}
```
## 基礎函數
```Python
set1 = {1, 2, 3, 4, 5, 6}
print('set的長度 len(set):', len(set1))
```
**輸出結果**
```
set的長度 len(set): 6
```
## 基礎方法
```Python
set1 = {1, 2, 3, 4, 5, 6}
set2 = {4, 5, 6, 7, 8, 9}
set1.add(0)
print('添加元素 set1.add(0)', set1)
# 計算差集,效果同 -
print('返回兩個集合的差集 set1.difference(set2)', set1.difference(set2))
print('返回兩個集合的差集 set2.difference(set1)', set2.difference(set1))
set1 = {1, 2, 3, 4, 5, 6}
set2 = {4, 5, 6, 7, 8, 9}
# 移除兩個集合中都存在的元素
set1.difference_update(set2)
print('移除set1中set1和set2都存在的元素 set1.difference_update(set2)', set1)
set1 = {1, 2, 3, 4, 5, 6}
set2 = {4, 5, 6, 7, 8, 9}
set2.difference_update(set1)
print('移除set2中set1和set2都存在的元素 set2.difference_update(set1)', set2)
# 移除元素
set1 = {1, 2, 3, 4, 5, 6}
set2 = {4, 5, 6, 7, 8, 9}
# 移除指定元素
set1.discard(10)
print("移除的元素不存在時不報錯 set1.discard(10):", set1)
set1.remove(6)
print("移除的元素不存在時報錯 set1.remove(6):", set1)
# 隨機移除元素
set1.pop()
print('隨機移除元素后的set1 set1.pop():', set1)
set1 = {1, 2, 3, 4, 5, 6}
set2 = {4, 5, 6, 7, 8, 9}
set3 = {5, 6, 10}
set4 = {5, 6, 7, 8, 9}
print('返回多個集合的交集,set1不變 set1.intersection(set2,set3,set4):', set1.intersection(set2,set3,set4), set1)
set1.intersection_update(set2,set3,set4)
print('set1變為set1與其他集合的交集 set1.intersection_update(set2,set3,set4):', set1)
set1 = {1, 2, 3, 4, 5, 6}
set2 = {4, 5, 6}
print('判斷兩個集合是否包含相同元素,如果包含返回False set2.isdisjoint(set1):', set2.isdisjoint(set1))
# 子集判斷
print('判斷set1是否是set2的子集 set1.issubset(set2):', set1.issubset(set2))
print('判斷set2是否是set1的子集 set2.issubset(set1):', set2.issubset(set1))
# 父集判斷
print('判斷set1是否是set2的父集 set1.issuperset(set2):', set1.issuperset(set2))
print('判斷set2是否是set1的父集 set2.issuperset(set1):', set2.issuperset(set1))
set1 = {1, 2, 3, 4, 5, 6}
set2 = {4, 5, 6, 9}
print("異或運算 set1.symmetric_difference(set2):", set1.symmetric_difference(set2))
set1.symmetric_difference_update(set2)
print("異或運算后將相同部分移除,不同部分添加到set1中 set1.symmetric_difference_update(set2):", set1)
set1 = {1, 2, 3, 4, 5, 6}
set2 = {4, 5, 6, 7, 8, 9}
set3 = {5, 6, 10}
print('計算集合的合集 set1.union(set2, set3):', set1.union(set2, set3))
set1 = {1, 2, 3, 4, 5, 6}
set2 = {5, 6, 10}
set1.update(set2)
print('將set2中的元素添加到set1中 set1.update(set2):', set1)
print('set.clear() 和 set.copy()用法同列表')
```
**輸出結果**
```
添加元素 set1.add(0) {0, 1, 2, 3, 4, 5, 6}
返回兩個集合的差集 set1.difference(set2) {0, 1, 2, 3}
返回兩個集合的差集 set2.difference(set1) {8, 9, 7}
移除set1中set1和set2都存在的元素 set1.difference_update(set2) {1, 2, 3}
移除set2中set1和set2都存在的元素 set2.difference_update(set1) {7, 8, 9}
移除的元素不存在時不報錯 set1.discard(10): {1, 2, 3, 4, 5, 6}
移除的元素不存在時報錯 set1.remove(6): {1, 2, 3, 4, 5}
隨機移除元素后的set1 set1.pop(): {2, 3, 4, 5}
返回多個集合的交集,set1不變 set1.intersection(set2,set3,set4): {5, 6} {1, 2, 3, 4, 5, 6}
set1變為set1與其他集合的交集 set1.intersection_update(set2,set3,set4): {5, 6}
判斷兩個集合是否包含相同元素,如果包含返回False set2.isdisjoint(set1): False
判斷set1是否是set2的子集 set1.issubset(set2): False
判斷set2是否是set1的子集 set2.issubset(set1): True
判斷set1是否是set2的父集 set1.issuperset(set2): True
判斷set2是否是set1的父集 set2.issuperset(set1): False
異或運算 set1.symmetric_difference(set2): {1, 2, 3, 9}
異或運算后將相同部分移除,不同部分添加到set1中 set1.symmetric_difference_update(set2): {1, 2, 3, 9}
計算集合的合集 set1.union(set2, set3): {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
將set2中的元素添加到set1中 set1.update(set2): {1, 2, 3, 4, 5, 6, 10}
set.clear() 和 set.copy()用法同列表
```
# 代碼庫地址
[https://github.com/liuzhen153/play-algorithm-python](https://github.com/liuzhen153/play-algorithm-python)