前面我们已经讲了Python中的列表:Python序列之列表、元组:Python序列之元组和字典:Python序列之字典。今天我们再来看一下Python中另一种序列——集合。
集合这个词大家肯定不陌生,高中数学必修一第一章,便是集合。你应该还记得数学老师说过:“集合具有三个性质:确定性、互异性、无序性”,Python中的集合set
便是借鉴了数学中的这种“数据结构”。同样满足这三个性质。
不仅如此,Python还提供的数学中集合的各种运算:求并集、求交集、求补集……
集合是无序可变的,元素不能重复,故经常用集合来实现数据去重。实际上,集合底层是字典实现,集合的所有元素都是字典中的"键对象",因此是不能重复的且唯一的。
{}
创建a = {3, 5, 7}
b = {} # 创建一个空集合
c = {3} # 只有一个元素的集合
print(a) # 输出:{3, 5, 7}
print(b) # 输出:{}
print(c) # 输出:{3}
set()
函数创建a = ['a', 2, True]
b = set(a)
c = set() # 创建一个空集合
print(b) # 输出:{True, 'a', 2}
print(c) # 输出:set()
print(type(b)) # 输出:
print(type(c)) # 输出:
由上面的两个例子可知,Python对空集合的打印表示有两种:{}
和set()
。
add()
添加单个元素a = {10, 20, 30}
a.add('a')
print(a) # 输出:{10, 'a', 20, 30}
update()
批量添加元素a = {10, 20, 30}
b = [True, False, 999]
a.update(b)
print(a) # 输出:{False, True, 999, 10, 20, 30}
remove()
删除指定元素a = {10, 20, 30, 40, 50}
a.remove(30)
print(a) # 输出:{50, 20, 40, 10}
a.remove(999) # 报错:KeyError: 999
可以发现,当试图用remove()
移除一个集合中并不存在的元素时,解释器会报错。这种反应过于暴力,因此有了更加温柔且绅士的删除方法——discard()
。
discard()
删除指定元素a = {10, 20, 30, 40, 50}
a.remove(30)
print(a) # 输出:{50, 20, 40, 10}
a.discard(999) # 无报错
print(a) # 输出:{50, 20, 40, 10}
当试图删除一个集合中并不存在的元素时,discard()
并不会报错,而是什么都不干,程序照常往下运行,优雅且绅士~
clear()
清空整个集合a = {10, 20, 30, 40, 50}
a.clear()
print(a) # 输出:set()
pop()
随机弹出一个元素a = {10, 20, 30, 40, 50}
b = a.pop()
print(b) # 输出:50
print(a) # 输出:{20, 40, 10, 30}
我们可以充分利用集合的互异性来实现列表元素的去重:
a = [1, 1, 5, 6, 6, 8, 9, 8, 6]
b = set(a)
print(b) # 输出:{1, 5, 6, 8, 9}
像数学中概念一样,Python对集合也提供了并集、交集、差集等运算。
下面展式了三种取交集的方法:
a = {1, 2, 3, 4}
b = {2, 3, 99, 100, 'yyy'}
c = a & b # 方法一:&
print(c) # 输出:{2, 3}
d = a.intersection(b) # 方法二:取交集并返回一个新集合
print(d) # 输出:{2, 3}
print(a) # 输出:{1, 2, 3, 4}
a.intersection_update(b) # 方法三:取交集并更新原集合
print(a) # 输出:{2, 3}
a = {1, 2, 3, 4}
b = {2, 3, 99, 100, 'yyy'}
c = a | b # 方法一:|
print(c) # 输出:{1, 2, 3, 4, 99, 100, 'yyy'}
d = a.union(b) # 方法二:union()
print(d) # 输出:{1, 2, 3, 4, 99, 100, 'yyy'}
下面展式了三种取差集的方法:
a = {1, 2, 3, 4}
b = {2, 3, 99, 100, 'yyy'}
c = a - b # 方法一:-
print(c) # 输出:{1, 4}
d = a.difference(b) # 方法二:取交集并返回一个新集合
print(d) # 输出:{1, 4}
print(a) # 输出:{1, 2, 3, 4}
a.difference_update(b) # 方法三:取交集并更新原集合
print(a) # 输出:{1, 4}
注意:差集是有方向性的,A-B ≠ B-A
python集合set内置方法symmetric_differece()
,可以用来返回两个集合(或调用对象集合与其它可迭代对象iterable)中非共同的元素组成的新集合set。
a = {1, 2, 3, 4}
b = {2, 3, 99, 100, 'yyy'}
c = a ^ b # 方法一:^
print(c) # 输出:{1, 99, 100, 'yyy', 4}
d = a.symmetric_difference(b) # 方法二:取对称差并返回一个新集合
print(d) # 输出:{1, 99, 100, 4, 'yyy'}
print(a) # 输出:{1, 2, 3, 4}
a.symmetric_difference_update(b) # 方法三:取对称差并更新原集合
print(a) # 输出:{1, 99, 100, 4, 'yyy'}
方法 | 用途 |
---|---|
a.issubset(b) |
判断a 是否为b 的子集 |
a.issuperset(b) |
判断a 是否为b 的母集 |
a.isdisjoint(b) |
判断a 与b 的交集是否为空集 |
a = {1, 2, 3}
b = {1, 2, 3, 4, 5}
c = {1, 2, 'yyy'}
d = {'a', 'b', 'c'}
print(a.issubset(b)) # 输出:True
print(a.issubset(c)) # 输出:False
print(b.issuperset(a)) # 输出:True
print(a.isdisjoint(c)) # 输出:False
print(a.isdisjoint(d)) # 输出:True
Python中的集合可以认为是数学中集合的具体实现,具有数学集合的三个性质,不仅可以进行增删改查,还可以进行数学中的集合运算。