集合是一个可变的无序的不能包含重复元素的容器。可以把集合看成是由字典的键构成的一个容器,集合中的元素是唯一的、无序的和不可变的。
1.使用大括号{}创建非空集合,示例如下:
>>> s = {1,2,3,4,5}
>>> print(s)
{1,2,3,4,5}
>>> print(type(s))
<class 'set'>
>>> s = {[1, 2, 3, 1, 2]} # 列表为可变类型,不能当作集合的元素,会报错
Traceback (most recent call last):
File "test.py", line 1, in <module>
s = {[1, 2, 3, 1, 2]}
TypeError: unhashable type: 'list'
注意:空的大括号只能用于创建字典。
2.使用set()函数可以把其他类型转换为集合,并且去掉其中的重复值,示例如下:
>>> s = set([1, 1, 2, 2, 3, 4, 8, 8]) # 将列表转化为集合
>>> print(s)
{1, 2, 3, 4, 8}
>>> print(type(s))
<class 'set'>
>>> s = set('python') # 将字符串转化为集合
>>> print(s)
{'n', 'h', 'p', 'y', 't', 'o'} # 集合是无序的,每次输出元素的位置都有可能不同
>>> print(type(s))
<class 'set'>
>>> s = set() # 使用set()函数创建空集合
>>> print(s)
set() # 空集合
>>> print(type(s))
<class 'set'>
set()函数参数为可迭代对象,如字符串、列表、元组等;当无参数时,创建一个空集合,空集合用set()表示,而非{}。集合是一个可变对象,可以对集合中的元素进行添加、删除,但是集合是无序的,不能位置进行索引切片获取元素,同时也没有键值对的结构,不能使用键去获取值,因此,集合中的元素是无法被获取和修改的。
集合提供了一些方法可以对其中的元素进行添加,下面介绍这些常用的添加方法:
1.add()函数添加单个元素,语法如下:
set.add(obj)
参数:
返回值:无返回值
将元素obj添加到集合中,如果元素已存在,则不进行任何操作。示例如下:
>>> s = {1, 2, 3, 4, 8}
>>> s.add('a') # 只能添加一个元素
{1, 2, 3, 4, 'a', 8}
2.update()函数添加多个元素,语法如下:
set.update(seq)
参数:
返回值:无返回值
示例如下:
# 添加字符串
>>> s = {1, 2, 3, 4, 8}
>>> s.update('python')
>>> print(s)
{1, 2, 3, 4, 'y', 8, 'h', 't', 'o', 'p', 'n'}
# 添加列表
>>> s = {1, 2, 3, 4, 8}
>>> s.update([7,9,12],[10,15,20])
>>> print(s)
{1, 2, 3, 4, 7, 8, 9, 10, 12, 15, 20}
# 添加元组
>>> s = {1, 2, 3, 4, 8}
>>> s.update((7,9,12,10,15,20))
>>> print(s)
{1, 2, 3, 4, 7, 8, 9, 10, 12, 15, 20}
# 添加字典
>>> s = {1, 2, 3, 4, 8}
>>> s.update({'name': 'lilei', 'age': 20, 'grade': 'three'}) # 添加字典的键
>>> print(s)
{1, 2, 3, 4, 'name', 8, 'grade', 'age'}
集合提供了几种删除元素的方法:
1.remove()函数删除,语法如下:
set.remove(x)
参数:
返回值:无返回值。
示例代码如下:
>>> s = {1, 2, 3, 4, 8}
>>> s.remove(3) # 删除元素3
>>> print(s)
{1, 2, 4, 8}
>>> s = {1, 2, 3, 4, 8}
>>> s.remove('a') # 删除集合内不存在的元素时报错
>>> print(s)
Traceback (most recent call last):
File "test.py", line 2, in <module>
print(s.remove('a'))
KeyError: 'a'
2.discard()函数删除,语法如下:
set.discard(x)
参数:
返回值:无返回值。
示例代码如下:
>>> s = {1, 2, 3, 4, 8}
>>> s.discard(4) # 删除元素3
>>> print(s)
{1, 2, 3, 8}
>>> s = {1, 2, 3, 4, 8}
>>> s.remove('a') # 删除集合内不存在的元素时不会报错
>>> print(s)
{1, 2, 3, 4, 8}
3.pop()函数随机删除集合中的一个元素,语法如下:
set.pop()
无参数,返回值被随机删除的元素,集合是无序的,pop()会删除集合左面第一个元素。
示例如下:
>>> s = {1, 2, 3, 4, 8}
>>> print(s.pop())
1 # 多次执行,被删除的值都不一样
4.clear()函数清空集合,语法如下:
set.clear()
无参数,无返回值。示例如下:
>>> s = {1, 2, 3, 4, 8}
>>> s.clear() # 清空列表
>>> print(s) # 空集合
set()
集合中还提供了一些方法,下面介绍一些常用方法:
1.拷贝集合
copy()方法方法用于拷贝一个集合,语法如下:
set.copy()
无参数,返回值拷贝集合的副本,示例如下:
>>> s = {1, 2, 3, 4, 8}
>>> print(s.copy())
{1, 2, 3, 4, 8}
2.判断两个集合是否包含相同的元素
isdisjoint() 用于判断两个集合是否包含相同的元素,如果没有返回 True,否则返回 False,语法如下:
set.isdisjoint(set)
参数:
返回值:布尔值,如果不包含返回 True,否则返回 False。
示例如下:
>>> s1 = {1, 2, 3, 4, 8}
>>> s2 = {3, 4, 5, 7, 10}
>>> print(s1.isdisjoint(s2)) # 两个集合有共同的元素,返回False
False
集合支持数学理论中的各种集合运算,不仅可以通过运算符号实现,集合还提供了函数来实现集合运算,对应关系如下表:
方法 | 符号 | 描述 |
---|---|---|
x.difference(y) | x - y | x和y的差集 |
x.intersection(y) | x & y | x和y的交集 |
x.union(y) | x | y | x和y的并集 |
x.issubset(y) | x < y | x是y的子集 |
x.issuperset(y) | x > y | x是y的超集 |
x.symmetric_difference(y) | x^y | x和y的对称差 |
示例如下:
>>> s1 = {1, 2, 3, 4, 5}
>>> s2 = {4, 5, 6, 7, 8}
# 差集
>>> print(s1.difference(s2))
{1, 2, 3}
>>> print(s1 - s2)
{1, 2, 3}
# 交集
>>> print(s1.intersection(s2))
{4, 5}
>>> print(s1 & s2)
{4, 5}
# 并集
>>> print(s1.union(s2))
{1, 2, 3, 4, 5, 6, 7, 8}
>>> print(s1 | s2)
{1, 2, 3, 4, 5, 6, 7, 8}
# 子集
>>> print(s1.issubset(s2))
False
>>> print(s1 < s2)
False
# 超集
>>> print(s1.issuperset(s2))
False
>>> print(s1 > s2)
False
# 对称差
>>> print(s1.symmetric_difference(s2))
{1, 2, 3, 6, 7, 8}
>>> print(s1 ^ s2)
{1, 2, 3, 6, 7, 8}