Python set 函数
上次修改时间:2025 年 4 月 11 日
本综合指南探讨了 Python 的 set 函数,该函数创建一个包含唯一元素的无序集合。我们将介绍集合的创建、操作和实际示例。
基本定义
set 函数创建一个包含唯一且可哈希元素的 mutable set 对象。集合是无序的集合,不允许重复元素。
主要特点:元素必须是可哈希的,集合是可变的,但元素必须是不可变的,支持数学集合运算,如并集和交集。
创建基本集合
以下是简单的用法,展示了如何使用 set 构造函数从不同的可迭代类型创建集合。
# From a list
numbers = set([1, 2, 3, 2, 1])
print(numbers) # {1, 2, 3}
# From a string
chars = set("hello")
print(chars) # {'h', 'e', 'l', 'o'}
# From a tuple
items = set(('apple', 'banana', 'apple'))
print(items) # {'apple', 'banana'}
# Empty set
empty = set()
print(empty) # set()
此示例展示了从不同可迭代对象创建集合。重复项会自动删除。 请注意,空集合的语法与字典不同。
字符串示例显示集合如何将序列分解为单个元素。 请注意输出中由于唯一性而只有一个“l”。
集合操作
集合支持强大的数学运算。 此示例演示了常见的集合运算,如并集、交集和差集。
a = set([1, 2, 3, 4])
b = set([3, 4, 5, 6])
# Union
print(a | b) # {1, 2, 3, 4, 5, 6}
print(a.union(b)) # same as above
# Intersection
print(a & b) # {3, 4}
print(a.intersection(b))
# Difference
print(a - b) # {1, 2}
print(a.difference(b))
# Symmetric difference
print(a ^ b) # {1, 2, 5, 6}
print(a.symmetric_difference(b))
这演示了四个基本集合运算。 每个操作都有运算符和方法版本。 对称差显示存在于任一集合中但不同时存在于两个集合中的元素。
这些操作经过高度优化,比使用列表的手动实现快得多。
集合推导式
与列表推导式类似,Python 支持集合推导式,以便简洁地创建集合。 此示例显示了各种集合推导式。
# Basic comprehension
squares = {x**2 for x in range(10)}
print(squares) # {0, 1, 4, 9, 16, 25, 36, 49, 64, 81}
# With condition
odds = {x for x in range(20) if x % 2 != 0}
print(odds) # {1, 3, 5, 7, 9, 11, 13, 15, 17, 19}
# From another iterable
words = ["hello", "world", "python"]
lengths = {len(word) for word in words}
print(lengths) # {5, 6}
集合推导式遵循与列表推导式相同的语法,但使用大括号。 它们会自动处理唯一性,就像常规集合一样。
第二个示例过滤奇数。 第三个示例显示了转换,演示了集合自动删除长度重复项。
成员资格测试
由于哈希表实现,集合提供非常快的成员资格测试。 此示例比较了集合和列表的性能。
import timeit
# Large collections
big_set = set(range(1000000))
big_list = list(range(1000000))
# Membership test functions
def test_set():
return 999999 in big_set
def test_list():
return 999999 in big_list
# Timing
print("Set membership:", timeit.timeit(test_set, number=10000))
print("List membership:", timeit.timeit(test_list, number=10000))
此基准测试显示了成员资格测试的显着性能差异。 集合使用 O(1) 查找,而列表使用 O(n) 线性搜索。
对于大型集合,集合在成员资格测试方面可能比列表快数千倍。
冻结集合
Python 通过 frozenset 提供不可变集合。 此示例显示了它们的创建和用作字典键。
# Create frozenset
fs = frozenset([1, 2, 3, 4])
print(fs) # frozenset({1, 2, 3, 4})
# Use as dictionary key
d = {
frozenset([1, 2]): "set with 1 and 2",
frozenset([3, 4]): "set with 3 and 4"
}
print(d[frozenset([1, 2])]) # "set with 1 and 2"
冻结集合是可哈希且不可变的,使其适合作为字典键。 常规集合不能以这种方式使用,因为它们是可变的。
除了修改集合的操作之外,所有集合操作都适用于冻结集合。 当您需要在可哈希形式中使用集合属性时,它们很有用。
最佳实践
- 用于唯一性: 转换为集合以删除重复项
- 利用快速查找: 使用集合进行成员资格测试
- 选择正确的语法: 对空集合使用 set(),{} 创建 dict
- 考虑冻结集合: 当需要不变性时
- 记录假设: 记下顺序无关紧要的情况
资料来源
作者
列出所有 Python 教程。