跳至内容

Python 集合

Python中,集合(Set)是一组唯一数据的集合。即,集合中的元素是不可重复的。比如,学生的学号就是保证唯一的,因此存储学号选用集合是最合适的。

学生学号集合

创建集合

Python中,通过将元素放入大括号 {},逗号分隔的方式创建集合。一个集合可以有任意类型的元素。但是这些元素不能是可变元素,比如列表List,集合Set,字典Dict等。

例如:set的创建

python
# 创建整型集合
set_ids = {101, 102, 103, 104, 105}
# 创建字符集合
set_sites = {'w', '3', 'q', 'u', 'e', 'r', 'y'}
# 创建混合类型集合
set_mixed = {"hello", 1, "world"}

print(set_ids)
print(set_sites)
print(set_mixed)


# 输出:
# {101, 102, 103, 104, 105}
# {'w', '3', 'q', 'u', 'e', 'r', 'y'}
# {"hello", "world", 1}
# 创建整型集合
set_ids = {101, 102, 103, 104, 105}
# 创建字符集合
set_sites = {'w', '3', 'q', 'u', 'e', 'r', 'y'}
# 创建混合类型集合
set_mixed = {"hello", 1, "world"}

print(set_ids)
print(set_sites)
print(set_mixed)


# 输出:
# {101, 102, 103, 104, 105}
# {'w', '3', 'q', 'u', 'e', 'r', 'y'}
# {"hello", "world", 1}

注意

Set中元素的输出可能与创建时的顺序是不一致的,这是因为Set不是一个顺序集合。

创建空集合

创建非空集合时,使用{}插入元素即可。但是创建空集合时,不能使用{},因为它将返回空字典,而不是空集合。正确创建空集合的方式是使用set()函数。

例如:创建非空set

python
# 正确创建空集合的方式
empty_set = set()
# 错误创建空集合的方式, 实际创建的是字典
empty_dict = {}

print("empty_set的类型是:", type(empty_set))
print("empty_dict的类型是:", type(empty_dict))


# 输出:
# empty_set的类型是:<class 'set'>
# empty_dict的类型是:<class 'dict'>
# 正确创建空集合的方式
empty_set = set()
# 错误创建空集合的方式, 实际创建的是字典
empty_dict = {}

print("empty_set的类型是:", type(empty_set))
print("empty_dict的类型是:", type(empty_dict))


# 输出:
# empty_set的类型是:<class 'set'>
# empty_dict的类型是:<class 'dict'>

集合的重复项

集合中的元素是唯一的,即使创建时初始化重复的元素,实际存入的也是排重后的。

python
nums = {1, 2, 2, 3, 6, 6}
print(nums)


# 输出:
# 1, 2, 3, 6
nums = {1, 2, 2, 3, 6, 6}
print(nums)


# 输出:
# 1, 2, 3, 6

这里,可以很明显的看出创建后的集合并没有包括重复的项。

集合修改

集合是可变类型,但是由于集合是无序的,所以不存在索引概念。也就是说,对于集合,不能通过索引或者Slice截取访问集合的元素。

1. 新增集合元素

Python中,通过add()方法新增集合项。

python
nums = {1, 2, 3}
print("新增前:", nums)
nums.add(4)
print("新增后:", nums)


# 输出:
# 新增前:{1, 2, 3}
# 新增后:{1, 2, 3, 4}
nums = {1, 2, 3}
print("新增前:", nums)
nums.add(4)
print("新增后:", nums)


# 输出:
# 新增前:{1, 2, 3}
# 新增后:{1, 2, 3, 4}

2. 更新集合元素

Python中,通过update()方法使用其他的集合类型(比如列表、元组、集合等)去更新当前集合。

python
langs = {"c", "cpp", "c#"}
new_langs = {"java", "python"}

langs.update(new_langs)
print(langs)


# 输出:
# {"java", "c", "cpp", "c#", "python"}
langs = {"c", "cpp", "c#"}
new_langs = {"java", "python"}

langs.update(new_langs)
print(langs)


# 输出:
# {"java", "c", "cpp", "c#", "python"}

集合删除

Python中,通过discard()方法移除集合项。

python
langs = {"c", "cpp", "c#"}
print("移除前:", langs)
langs.discard("cpp")
print("移除后:", langs)


# 输出: 
# 移除前:{"cpp", "c", "c#"}
# 移除后:{"c", "c#"}
langs = {"c", "cpp", "c#"}
print("移除前:", langs)
langs.discard("cpp")
print("移除后:", langs)


# 输出: 
# 移除前:{"cpp", "c", "c#"}
# 移除后:{"c", "c#"}

集合遍历

Python中,通过for循环完成集合的遍历。

python
langs = {"c", "cpp", "c#"}

for lang in langs:
    print(lang)


# 输出:
# cpp
# c
# c#
langs = {"c", "cpp", "c#"}

for lang in langs:
    print(lang)


# 输出:
# cpp
# c
# c#

集合元素个数

Python中,通过len()获取集合元素的个数

python
nums = {1, 2, 3, 4}

print("nums集合的元素个数:", len(nums))


# 输出:
# nums集合的元素个数:4
nums = {1, 2, 3, 4}

print("nums集合的元素个数:", len(nums))


# 输出:
# nums集合的元素个数:4

集合操作

集合常见的操作有并集、交集、差集、对称差等

1. 并集

集合A和集合B的并集是出现在集合A或集合B中经排重后的元素集合。Python中,使用 | 运算符或 union()方法来执行并集运算。

集合的并集

python
A = {1, 3, 5}
B = {2, 4, 6}

C = A | B
D = A.union(B)
print("集合C:", C)
print("集合D:", D)


# 输出:
# 集合C:{1, 2, 3, 4, 5, 6}
# 集合D: {1, 2, 3, 4, 5, 6}
A = {1, 3, 5}
B = {2, 4, 6}

C = A | B
D = A.union(B)
print("集合C:", C)
print("集合D:", D)


# 输出:
# 集合C:{1, 2, 3, 4, 5, 6}
# 集合D: {1, 2, 3, 4, 5, 6}

A | B 和 A.union(B) 等同于 A ⋃ B 操作

2. 交集

集合A和集合B的交集是在集合A和集合B中都出现的元素集合。Python中,使用 & 运算符或 intersection()方法来执行交集运算。

集合的交集

python
A = {1, 3, 5}
B = {1, 2, 3}

C = A & B
D = A.intersection(B)
print("集合C:", C)
print("集合D:", D)


# 输出:
# 集合C:{1, 3}
# 集合D: {1, 3}
A = {1, 3, 5}
B = {1, 2, 3}

C = A & B
D = A.intersection(B)
print("集合C:", C)
print("集合D:", D)


# 输出:
# 集合C:{1, 3}
# 集合D: {1, 3}

A & B 和 A.intersection(B) 等同于 A ⋂ B 操作

3. 差集

集合A和集合B的差集是包含在集合A且不在集合B中的元素集合。Python中,使用 - 运算符或 difference()方法来执行差集运算。

集合的交集

python
A = {1, 4, 5}
B = {1, 2, 3}

C = A - B
D = A.difference(B)
print("集合C:", C)
print("集合D:", D)


# 输出:
# 集合C:{4, 5}
# 集合D: {4, 5}
A = {1, 4, 5}
B = {1, 2, 3}

C = A - B
D = A.difference(B)
print("集合C:", C)
print("集合D:", D)


# 输出:
# 集合C:{4, 5}
# 集合D: {4, 5}

A - B 和 A.difference(B) 等同于 A - B 操作

4. 对称差集

集合A和集合B的对称差集是集合A和集合B的元素去掉它们共存的元素后的集合。Python中,使用 ^ 运算符或 symmetric_difference()方法来执行对称差集运算。

集合的交集

python
A = {1, 4, 5}
B = {1, 2, 3}

C = A ^ B
D = A.symmetric_difference(B)
print("集合C:", C)
print("集合D:", D)


# 输出:
# 集合C:{4, 5, 2, 3}
# 集合D: {4, 5, 2, 3}
A = {1, 4, 5}
B = {1, 2, 3}

C = A ^ B
D = A.symmetric_difference(B)
print("集合C:", C)
print("集合D:", D)


# 输出:
# 集合C:{4, 5, 2, 3}
# 集合D: {4, 5, 2, 3}

集合比较

Python中,通过 == 运算符比较两个集合是否相等。

python
A = {1, 2, 3}
B = {3, 1, 2}

print("A==B: ", A==B)


# 输出:
# A==B: True
A = {1, 2, 3}
B = {3, 1, 2}

print("A==B: ", A==B)


# 输出:
# A==B: True

这里,虽然集合A和集合B创建时元素顺序不同,但是元素值是一样的。由于集合没有顺序性,所以这两个集合是相等的。

集合方法

Python中,集合Set 提供了丰富的内置方法。

函数名描述
add()新增集合元素
all()集合中所有元素为True时返回True
any()集合中任一元素为True时返回True
clear()清空集合的所有元素
copy()返回集合的拷贝
difference()返回集合的差集
discard()删除集合元素,如果元素不存在正常返回
enumerate()返回可枚举的对象,包含集合所有项的键值对
intersection()返回集合的交集
isdisjoint()()返回两个集合是否有交集
issubset()()返回当前集合是否为另一集合的子集
issuperset()()返回当前集合是否为另一集合的父集
len()集合元素的数量
max()集合中最大的元素
min()集合中最小的元素
pop()随机移除并返回集合的元素
remove()删除集合元素,如果元素不存在抛出异常
sorted()返回新的排序后的列表
sum()返回集合中所有元素之和
symmetric_difference()返回两个集合的对称差集
union()返回集合的并集