# 集合 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)