Python - 集合

大家好,有抱负的Python程序员们!今天,我们将深入探讨神奇的Python集合世界。作为你们友好邻里计算机科学老师,我很高兴能引导你们完成这次学习之旅。所以,拿上你最喜欢的饮料,舒服地坐好,让我们一起探索集合吧!

Python - Sets

Python中的集合

想象一下你有一袋五彩斑斓的弹珠。每颗弹珠都是独一无二的,你不在乎它们的顺序——你只是想知道你有哪些颜色的弹珠。本质上,这就是Python中的集合!

集合是一个无序的唯一元素集合。它就像一个数学集合:不允许有重复元素,且顺序无关紧要。当你需要存储唯一项目或执行集合操作(如并集、交集和差集)时,集合非常有用。

在Python中创建集合

让我们从创建第一个集合开始。在Python中创建集合主要有两种方法:

  1. 使用花括号 {}
  2. 使用set()构造函数

以下两种方法的例子:

# 方法1:使用花括号
fruits = {'苹果', '香蕉', '樱桃'}

# 方法2:使用set()构造函数
colors = set(['红色', '绿色', '蓝色'])

print(fruits)
print(colors)

输出:

{'苹果', '樱桃', '香蕉'}
{'蓝色', '红色', '绿色'}

请注意,输出的元素顺序可能与我们定义的顺序不同。这是因为集合是无序的!

集合中的重复元素

还记得我说的集合只包含唯一元素吗?让我们看看尝试添加重复元素会发生什么:

numbers = {1, 2, 3, 2, 4, 3, 5}
print(numbers)

输出:

{1, 2, 3, 4, 5}

如您所见,Python自动为我们移除了重复项。这难道不很整洁吗?

向集合中添加元素

要向集合中添加单个元素,我们使用add()方法。如果我们想一次添加多个元素,我们使用update()方法。

# 添加单个元素
fruits.add('橙子')
print(fruits)

# 添加多个元素
fruits.update(['葡萄', '芒果'])
print(fruits)

输出:

{'苹果', '樱桃', '香蕉', '橙子'}
{'苹果', '樱桃', '香蕉', '橙子', '葡萄', '芒果'}

从集合中移除元素

有多种方法可以从集合中移除元素。让我们来探索它们:

# 使用remove() - 如果元素不存在,则引发错误
fruits.remove('香蕉')

# 使用discard() - 如果元素不存在,则不引发错误
fruits.discard('奇异果')

# 使用pop() - 移除并返回一个任意元素
popped = fruits.pop()
print(f"移除的元素: {popped}")

# 使用clear() - 移除所有元素
fruits.clear()

print(fruits)

输出:

移除的元素: 樱桃
set()

集合中的成员测试

集合的美妙之处之一是它们允许非常快速的成员测试。我们可以使用in关键字来检查一个元素是否存在于集合中:

numbers = {1, 2, 3, 4, 5}
print(3 in numbers)  # True
print(6 in numbers)  # False

对于大型集合,使用集合比使用列表进行此操作要快得多!

集合操作

Python中的集合支持各种数学集合操作。让我们看看其中的一些:

set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}

# 并集
print(set1 | set2)  # 或者 set1.union(set2)

# 交集
print(set1 & set2)  # 或者 set1.intersection(set2)

# 差集
print(set1 - set2)  # 或者 set1.difference(set2)

# 对称差集
print(set1 ^ set2)  # 或者 set1.symmetric_difference(set2)

输出:

{1, 2, 3, 4, 5, 6, 7, 8}
{4, 5}
{1, 2, 3}
{1, 2, 3, 6, 7, 8}

Python集合推导式

就像列表推导式一样,Python也支持集合推导式。它们提供了一种简洁的方式,基于现有的可迭代对象创建集合。

# 创建0到9的数字平方的集合
squares = {x**2 for x in range(10)}
print(squares)

输出:

{0, 1, 4, 9, 16, 25, 36, 49, 64, 81}

使用集合推导式过滤元素

我们也可以使用集合推导式来过滤元素:

# 创建0到9的偶数平方集合
even_squares = {x**2 for x in range(10) if x % 2 == 0}
print(even_squares)

输出:

{0, 4, 16, 36, 64}

嵌套集合推导式

虽然不太常见,但嵌套集合推导式也是可能的:

# 创建(x, y)元组集合,其中x和y都是数字
digit_pairs = {(x, y) for x in range(3) for y in range(3)}
print(digit_pairs)

输出:

{(0, 1), (1, 2), (0, 0), (2, 0), (1, 1), (2, 2), (0, 2), (2, 1), (1, 0)}

冻结集合

最后但同样重要的是,让我们来谈谈冻结集合。冻结集合并排是Python集合对象的不可变版本。虽然集合的元素可以随时修改,但冻结集合的元素在创建后保持不变。

normal_set = {1, 2, 3}
frozen_set = frozenset([1, 2, 3])

normal_set.add(4)  # 这是有效的
# frozen_set.add(4)  # 这将引发AttributeError

当你需要一个不可变集合,例如将其用作字典的键时,冻结集合特别有用。

好了,各位!我们已经涵盖了Python集合的所有内容。记住,熟能生巧,所以不要犹豫,尝试这些概念吧。祝编码愉快!

以下是我们在讨论中提到的主要集合方法摘要表:

方法 描述
add() 向集合中添加一个元素
update() 向集合中添加多个元素
remove() 从集合中移除一个特定的元素(如果未找到则引发错误)
discard() 从集合中移除一个特定的元素(如果未找到则不引发错误)
pop() 从集合中移除并返回一个任意元素
clear() 从集合中移除所有元素
union() 返回包含集合的并集的集合
intersection() 返回包含集合的交集的集合
difference() 返回包含集合的差集的集合
symmetric_difference() 返回包含在任一集合中但不同时在两个集合中的元素的集合

Credits: Image by storyset