初识集合

与数学中的集合一样,Python中 集合(set) 中每一个元素都是独一无二的,因而集合具有去重功能

Python 中的集合很强大,你可以对集合轻松执行各种运算

新建集合

使用大括号 {}

集合和字典有时很容易弄混,因为它们都是用一对花括号定义的

只不过当内容是键值对时,表示的是字典,内容是诺干单独元素时,表示的是集合

1
2
languages = {'python', 'c', 'ruby', 'python'}
print(languages) # {'ruby', 'python', 'c'} 这里体现了集合的去重功能

使用 set()

使用 set() 函数可以将其他类型转换为集合

1
2
3
4
a = set("12345") # 字符串转集合
b = set(['4', '5', '6', '7', '8']) # 列表转集合
print(a) # ['1', '2', '3', '4', '5']
print(b) # ['4', '5', '6', '7', '8']

注意:

  • 集合不会以特定的顺序储存元素,反复执行上面的代码,输出元素的顺序会不同,当你使用 for ... in ... 结构时,提取出来的元素的顺序也是不定的
  • 当创建空集合时,必须使用 set() ,因为 {} 意为创建一个新字典

集合运算

在进行集合运算时,使用 集合运算符集合的方法 有时可以达到相同的效果

如果你从未了解过集合运算,下面这张图可能有所帮助

点击以打开

交集:A & B

在 A 与 B 中都有的元素,等同于 A.intersection(B) 方法

1
2
3
print(sorted(a & b))
print(sorted(a.intersection(b)))
# ['4', '5']

另一个与交集有关的方法是 A.isdisjoint(B) ,如果两个集合没有交集,则返回 True

1
2
print(a.isdisjoint(b)) # False
print(a.isdisjoint({'0'})) # True

并集:A | B

A 与 B 中的全部元素,等同于 A.union(B) 方法

1
2
3
print(sorted(a | b))
print(sorted(a.union(b)))
# ['1', '2', '3', '4', '5', '6', '7', '8']

补集:A - B

在 A 中有,而不在 B 中有的元素,等同于 A.difference(B) 方法

1
2
3
4
5
6
7
print(sorted(a - b))
print(sorted(a.difference(b)))
# ['1', '2', '3']

print(sorted(b - a))
print(sorted(b.difference(a)))
# ['6', '7', '8']

这里的补集应为 广义上的补集 ,包括 绝对补集(一般意义的补集)和 相对补集(差集)

对称差集:A ^ B

不同时包含于 A、B 的元素(并集中除去交集),等同于 A.symmetric_difference(B) 方法

1
2
3
print(sorted(a ^ b))
print(sorted(a.symmetric_difference(b)))
# ['1', '2', '3', '6', '7', '8']

上面的四个集合方法可以传入多个参数,表示连续运算,如 A.intersection(B,C)

子集 / 真子集:A <= B / A < B

其中,A <= B 等同于 A.issubset(B)

1
2
print(set("123") < a) # True
print(set("123").issubset(a)) # True

包含 / 超集:A >= B / A > B

其中,A >= B 等同于 A.issuperset(B)

1
2
print(set("1234567890") > a) # True
print(set("1234567890").issuperset(a)) # True

元素是否在集合中:in / not in

1
2
print(3 in {1, 2, 3})  # True
print(3 not in {1, 2, 3}) # False

集合其他常用方法/函数

统计元素个数

len()

1
print(len(a)) # 5

添加

set.add(obj)

将单个元素添加至集合中,如果元素已经在集合中,则不进行任何操作

1
2
a.add('0')
print(sorted(a)) # ['0', '1', '2', '3', '4', '5']

set.update(seq[,seq2,seq3,...])

seq 中的元素添加至集合中,seq 可以是是列表,元组,字典等,可以同时传入多个参数

1
2
a.update(['6', '7', '8', '9'])
print(sorted(a)) # ['1', '2', '3', '4', '5', '6', '7', '8', '9']

删除

set.remove(obj)

在集合中移除一个元素,如果找不到该元素就会报错

1
2
3
4
5
6
7
a.remove('3')
print(sorted(a)) # ['1', '2', '4', '5']
a.remove('3')
# Traceback (most recent call last):
# File "d:\Study\Python\test.py", line 21, in <module>
# a.remove('3')
# KeyError: '3'

set.discard(obj)

与前者基本相同,但找不到元素不会报错

1
2
3
4
a.discard('3')
print(sorted(a)) # ['1', '2', '4', '5']
a.discard('3')
print(sorted(a)) # ['1', '2', '4', '5']

set.pop(obj)

随机弹出一个元素,如果集合为空则会报错

1
2
a = set("12345")
print(a.pop()) # 1

set.clear()

清空集合

1
2
a.clear()
print(a) # set()

复制

set.copy()

返回一个集合的拷贝


不可变集

仿照列表与元组的关系,Python 中集合对应着不可变集

除了内部元素不可改变,其他地方与普通集合一模一样

不可变集使用 frozenset() 创建

虽然我也不知道这个有什么用