Python 数据结构:集合(Set)

集合(Set)是 Python 中一种内置的数据结构,用于存储多个元素。集合的特点是无序、可变且不允许重复元素。集合在许多情况下都非常有用,尤其是在需要进行数学集合运算(如交集、并集和差集)时。

1. 集合的基本概念

1.1 定义

集合是一个无序的元素集合,元素之间是唯一的。集合的定义可以使用大括号 {} 或者 set() 函数。

1.2 创建集合

# 使用大括号创建集合
my_set = {1, 2, 3, 4, 5}
print(my_set)  # 输出: {1, 2, 3, 4, 5}

# 使用 set() 函数创建集合
my_set2 = set([1, 2, 3, 4, 5])
print(my_set2)  # 输出: {1, 2, 3, 4, 5}

# 创建空集合
empty_set = set()
print(empty_set)  # 输出: set()

1.3 集合的特点

  • 无序性:集合中的元素没有固定的顺序。
  • 唯一性:集合中的元素是唯一的,重复的元素会被自动去除。
  • 可变性:集合是可变的,可以添加或删除元素。

2. 集合的基本操作

2.1 添加元素

使用 add() 方法可以向集合中添加单个元素。

my_set = {1, 2, 3}
my_set.add(4)
print(my_set)  # 输出: {1, 2, 3, 4}

2.2 更新集合

使用 update() 方法可以向集合中添加多个元素。

my_set = {1, 2, 3}
my_set.update([4, 5, 6])
print(my_set)  # 输出: {1, 2, 3, 4, 5, 6}

2.3 删除元素

使用 remove() 方法可以删除指定元素,如果元素不存在则会引发 KeyError

my_set = {1, 2, 3}
my_set.remove(2)
print(my_set)  # 输出: {1, 3}
# my_set.remove(4)  # 会引发 KeyError

使用 discard() 方法也可以删除元素,但如果元素不存在则不会引发错误。

my_set = {1, 2, 3}
my_set.discard(2)
print(my_set)  # 输出: {1, 3}
my_set.discard(4)  # 不会引发错误

使用 pop() 方法可以随机删除并返回一个元素。

my_set = {1, 2, 3}
element = my_set.pop()
print(element)  # 输出: 1 (可能是 1, 2, 或 3)
print(my_set)   # 输出: {2, 3} (具体输出取决于 pop 的结果)

2.4 清空集合

使用 clear() 方法可以清空集合中的所有元素。

my_set = {1, 2, 3}
my_set.clear()
print(my_set)  # 输出: set()

3. 集合的数学运算

集合支持多种数学运算,包括并集、交集和差集。

3.1 并集

使用 union() 方法或 | 运算符可以得到两个集合的并集。

set_a = {1, 2, 3}
set_b = {3, 4, 5}
union_set = set_a.union(set_b)
print(union_set)  # 输出: {1, 2, 3, 4, 5}

# 使用 | 运算符
union_set = set_a | set_b
print(union_set)  # 输出: {1, 2, 3, 4, 5}

3.2 交集

使用 intersection() 方法或 & 运算符可以得到两个集合的交集。

set_a = {1, 2, 3}
set_b = {3, 4, 5}
intersection_set = set_a.intersection(set_b)
print(intersection_set)  # 输出: {3}

# 使用 & 运算符
intersection_set = set_a & set_b
print(intersection_set)  # 输出: {3}

3.3 差集

使用 difference() 方法或 - 运算符可以得到两个集合的差集。

set_a = {1, 2, 3}
set_b = {3, 4, 5}
difference_set = set_a.difference(set_b)
print(difference_set)  # 输出: {1, 2}

# 使用 - 运算符
difference_set = set_a - set_b
print(difference_set)  # 输出: {1, 2}

3.4 对称差集

使用 symmetric_difference() 方法或 ^ 运算符可以得到两个集合的对称差集。

set_a = {1, 2, 3}
set_b = {3, 4, 5}
symmetric_difference_set = set_a.symmetric_difference(set_b)
print(symmetric_difference_set)  # 输出: {1, 2, 4, 5}

# 使用 ^ 运算符
symmetric_difference_set = set_a ^ set_b
print(symmetric_difference_set)  # 输出: {1, 2, 4, 5}

4. 集合的优缺点

4.1 优点

  • 高效性:集合的查找、添加和删除操作的平均时间复杂度为 O(1),非常高效。
  • 唯一性:集合自动去重,适合需要唯一元素的场景。
  • 数学运算:集合提供了丰富的数学运算支持,方便进行集合论相关的操作。

4.2 缺点

  • 无序性:集合中的元素没有顺序,无法通过索引访问元素。
  • 不可哈希:集合中的元素必须是可哈希的(如不可变类型),因此不能包含列表、字典等可变类型。
  • 内存消耗:由于集合需要维护元素的唯一性,可能会比列表占用更多的内存。

5. 注意事项

  • 在创建集合时,使用 {} 创建的空集合实际上是一个字典,因此创建空集合时必须使用 set()
  • 集合中的元素必须是不可变类型,如数字、字符串和元组等。
  • 集合的操作是基于哈希表实现的,因此在处理大量数据时,性能表现优异。

6. 示例代码

以下是一个使用集合的示例,展示了如何使用集合进行基本操作和数学运算。

# 创建集合
fruits = {"apple", "banana", "cherry"}
print("初始集合:", fruits)

# 添加元素
fruits.add("orange")
print("添加元素后:", fruits)

# 更新集合
fruits.update(["mango", "grape"])
print("更新集合后:", fruits)

# 删除元素
fruits.remove("banana")
print("删除元素后:", fruits)

# 交集
citrus = {"orange", "lemon", "lime"}
common_fruits = fruits.intersection(citrus)
print("共同的水果:", common_fruits)

# 并集
all_fruits = fruits.union(citrus)
print("所有水果:", all_fruits)

# 差集
non_citrus = fruits.difference(citrus)
print("非柑橘类水果:", non_citrus)

# 对称差集
unique_fruits = fruits.symmetric_difference(citrus)
print("独特水果:", unique_fruits)

结论

集合是 Python 中一种强大而灵活的数据结构,适用于多种场景。通过理解集合的基本操作和特性,开发者可以更有效地处理数据。希望本教程能帮助你深入理解集合的使用及其在实际编程中的应用。