Python学习笔记 - set 集合

集合的分类

  • 可变集合(set)
  • 不可变集合(frozenset)

集合的作用

  • 去重
  • 关系测试

创建集合

在 python 中,{} 不只是代表字典还代表了集合,其中的元素以逗号分隔,里面可以加入任意可哈希的数据类型。

集合是无序的, 且同一元素多次添加只保留一个

需要注意,仅仅使用一个 {} 初始化的化则认为是字典,直接采用 {...} 的方式初始化的话则认为是可变集合。

1
2
3
4
5
6
a = {} # 创建空字典,而非集合
a = {1} # 创建只有一个元素的集合时,元素后面无需加逗号
a = {1, 2, '3'} # 创建有多个元素的集合,集合元素数据类型可以不同,但必须是可哈希的,同时创建的集合是可变的
a = {1, 1, 2, 3} # a = {1, 2, 3}
a = set([1, 2, 3]) # a = {1, 2, 3}, type(a) is set,通过工厂函数创建了一个可变集合
a = frozenset([1, 2, 3]) # a = {1, 2, 3}, type(a) is frozenset,通过工厂函数创建了一个不可变集合

联合(union |)

相当于数学概念中的取并集

1
2
3
4
5
a = {1, 2, 3}
b = {1, 3, 4}

a|b # {1, 2, 3, 4}
a.union(b) # {1, 2, 3, 4}, a = {1, 2, 3} 不变

交集(intersection &)

相当于数学概念中的取交集

1
2
3
4
5
6
7
a = {1, 2, 3}
b = {1, 3, 4}

a&b # {1, 3}
a.intersection(b) # {1, 3}, a = {1, 2, 3} 不变

{x for x in a if x in b}# {1, 3}

差集(difference -)

相当于数学概念中的取差集

1
2
3
4
5
6
7
8
9
a = {1, 2, 3}
b = {1, 3, 4}

a-b # {2}
b-a # {4}
a.difference(b) # {2}, a = {1, 2, 3} 不变
b.difference(a) # {4}

{x for x in a if x not in b} # {2}

对称差分(symmetric_difference ^)

相当于数学概念中的二者的补集与其交集的差集

1
2
3
4
5
a = {1, 2, 3}
b = {1, 3, 4}

a^b # {2, 4}
a.symmetric_difference(b) # {2, 4}

获取元素

集合中没有索引的概念,元素无法获取,只能判断是否在集合中与遍历集合

判断元素是否在集合中

1
2
1 in a # 若 1 在集合 a 中返回 True,否则返回 False
1 not in a # 若 1 不在集合 a 中返回 True,否则返回 False

遍历集合

  1. 可以通过简单的 for 循环来实现遍历
  2. 可以通过 enumerate() 函数来同时遍历元素和其对应的下标,此函数返回一个类似拥有两个元素的列表的类,此类的每一项都是拥有两个元素的元组,第一个元素为索引,第二个元素为此索引对应的对象。
1
2
3
4
5
6
7
8
9
10
a = {1, 2, 3, 4}
for x in a:
print(x)
'''
输出结果为:
1
2
3
4
'''
1
2
3
4
5
6
7
8
9
10
a = {1, 2, 3, 4}
for (i, x) in enumerate(a):
print(i, x)
'''
输出结果为:
0 1
1 2
2 3
3 4
'''

提示:第一个元素实际上并不是索引,而是简单的一个数,此数的起始值可以通过在第二个参数传入起始值而改变

1
2
3
4
5
6
7
8
9
10
a = {1, 2, 3, 4}
for (i, x) in enumerate(a, 2):
print(i, x)
'''
输出结果为:
2 1
3 2
4 3
5 4
'''

添加元素

1
2
a.add(x) # 在列表末尾添加元素 x,每次只能添加一个
a.update(xs) # 在列表末尾添加一组元素,传入的参数应该是一个可迭代对象(如果是字符串则将每个字符添加)

删除元素

1
2
3
4
5
a = {1, 2, 3, 4, 5, 5, 7, 8, 9}
x = a.pop() # x = 1, a = {2, 3, 4, 5, 5, 7, 8},随即删除一个元素并返回这个元素
a.remove(5) # a = {2, 3, 4, 7, 8, 9},删除值为 5 的元素,不返回任何数据
a.clear() # a = set(),清空集合中全部元素
del a # a不再存在,删除集合,直接取消了定义

元素比较

子集、超集

1
2
3
4
5
6
a = {1, 2, 3, 4}
b = {1, 2, 3, 4, 5}
c = {1, 2, 3, 4, 5, 6}
a < b < c # True,a 是 b 的(真)子集,c 是 b 的(真)超集
b.issuperset(a) # True,判断 b 是否是 a 的超集
b.issubset(c) # True,判断 b 是否是 a 的子集

其他集合函数、方法

1
2
3
4
5
a = {1, 2, 3, 4, 5, 5, 7, 8, 9}
max(a) # 返回集合 a 中最大的元素(只能同类元素比较)
min(a) # 返回集合 a 中最大的元素(只能同类元素比较)
type(a) is set # True,判断 a 是不是可变集合
type(a) is frozenset # True,判断 a 是不是不可变集合