Python - 集合
大家好,有抱负的Python程序员们!今天,我们将深入探讨神奇的Python集合世界。作为你们友好邻里计算机科学老师,我很高兴能引导你们完成这次学习之旅。所以,拿上你最喜欢的饮料,舒服地坐好,让我们一起探索集合吧!
Python中的集合
想象一下你有一袋五彩斑斓的弹珠。每颗弹珠都是独一无二的,你不在乎它们的顺序——你只是想知道你有哪些颜色的弹珠。本质上,这就是Python中的集合!
集合是一个无序的唯一元素集合。它就像一个数学集合:不允许有重复元素,且顺序无关紧要。当你需要存储唯一项目或执行集合操作(如并集、交集和差集)时,集合非常有用。
在Python中创建集合
让我们从创建第一个集合开始。在Python中创建集合主要有两种方法:
- 使用花括号 {}
- 使用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