Python frozenset 函数
上次修改时间:2025 年 4 月 11 日
本综合指南探讨了 Python 的 frozenset 函数,该函数创建不可变的集合对象。我们将介绍创建、操作、用例以及使用不可变集合的实际示例。
基本定义
frozenset 函数返回一个不可变的集合对象。与常规集合不同,frozenset 在创建后无法修改。它们是可哈希的,可以用作字典键。
关键特性:不可变,无序,唯一元素,支持集合操作(并集、交集等),并且可哈希。元素必须是可哈希的。
创建 Frozenset
以下是基本用法,展示了如何从不同的可迭代对象创建 frozenset。这些示例演示了如何从列表、字符串和其他集合创建。
# From a list
numbers = frozenset([1, 2, 3, 2, 1])
print(numbers) # frozenset({1, 2, 3})
# From a string
letters = frozenset("hello")
print(letters) # frozenset({'h', 'e', 'l', 'o'})
# From another set
regular_set = {4, 5, 6}
frozen = frozenset(regular_set)
print(frozen) # frozenset({4, 5, 6})
此示例展示了创建 frozenset 的三种方法。重复项会自动删除,就像常规集合一样。元素的顺序不会保留。
请注意,虽然 frozenset 本身是不可变的,但其元素也必须是不可变的(可哈希的)类型。
使用 Frozenset 作为字典键
此示例演示了如何将 frozenset 用作字典键,这对于常规可变集合是不可能的。
# Create a dictionary with frozenset keys
config = {
frozenset(['admin', 'user']): "Full access",
frozenset(['user']): "Read-only access",
frozenset(['guest']): "No access"
}
# Access values using frozenset keys
print(config[frozenset(['user'])]) # Read-only access
print(config[frozenset(['admin', 'user'])]) # Full access
# Trying with regular set would raise TypeError
try:
{set(['a']): "value"}
except TypeError as e:
print(f"Error: {e}") # unhashable type: 'set'
这展示了 frozenset 如何在字典中启用类似集合的键。该示例将权限集映射到访问级别。常规集合不能用作键。
该错误演示了为什么需要 frozenset 来处理此用例 - 常规集合是可变的,因此不可哈希。
Frozenset 的集合操作
Frozenset 支持所有标准集合操作。此示例演示了并集、交集、差集和对称差集操作。
fs1 = frozenset([1, 2, 3, 4])
fs2 = frozenset([3, 4, 5, 6])
# Union
print(fs1 | fs2) # frozenset({1, 2, 3, 4, 5, 6})
# Intersection
print(fs1 & fs2) # frozenset({3, 4})
# Difference
print(fs1 - fs2) # frozenset({1, 2})
# Symmetric difference
print(fs1 ^ fs2) # frozenset({1, 2, 5, 6})
# These operations return new frozensets
result = fs1 | fs2
print(type(result)) # <class 'frozenset'>
所有标准集合操作都适用于 frozenset 并返回新的 frozenset。由于 frozenset 是不可变的,因此这些操作不会修改原始 frozenset。
请注意,您可以在这些操作中将 frozenset 与常规集合混合使用,但结果类型取决于左侧操作数。
成员资格测试和方法
此示例显示了成员资格测试和可用的 frozenset 方法。虽然 frozenset 是不可变的,但它们支持所有非突变集合方法。
colors = frozenset(['red', 'green', 'blue'])
# Membership testing
print('red' in colors) # True
print('yellow' in colors) # False
# Non-mutating methods
print(colors.isdisjoint(frozenset(['yellow']))) # True
print(colors.issubset({'red', 'green', 'blue', 'yellow'})) # True
print(colors.issuperset({'red', 'green'})) # True
# len(), copy() work as expected
print(len(colors)) # 3
colors_copy = colors.copy()
print(colors_copy) # frozenset({'red', 'green', 'blue'})
Frozenset 支持所有不修改集合的集合操作。成员资格测试非常高效(O(1)),就像常规集合一样。
诸如 isdisjoint、issubset 和 issuperset 之类的方法对于集合比较特别有用。
数据结构中的 Frozenset
此高级示例演示了如何在更复杂的数据结构中使用 frozenset,从而利用其可哈希性和不变性。
from collections import defaultdict
# Using frozenset in a defaultdict
graph = defaultdict(set)
# Add edges (undirected graph)
edges = [
frozenset({'A', 'B'}),
frozenset({'B', 'C'}),
frozenset({'C', 'A'}),
frozenset({'C', 'D'})
]
for edge in edges:
for node in edge:
graph[node].update(edge - {node})
print(graph)
# defaultdict(<class 'set'>, {
# 'A': {'B', 'C'},
# 'B': {'A', 'C'},
# 'C': {'A', 'B', 'D'},
# 'D': {'C'}
# })
# Using frozenset in a set of sets
unique_combinations = {
frozenset({'a', 'b'}),
frozenset({'b', 'c'}),
frozenset({'a', 'c'})
}
print(frozenset({'b', 'a'}) in unique_combinations) # True
这展示了两个高级用例:图边存储和唯一组合。Frozenset 确保边缘表示与顺序无关且可哈希。
图示例有效地存储了每个节点的邻居。组合示例演示了 frozenset 如何表示无序对。
最佳实践
- 用于不变性: 当您需要一个不应更改的集合时
- 字典键: 非常适合类似集合的字典键
- 性能: 与常规集合相同的 O(1) 查找
- 内存: 对于大型集合,比元组更节省内存
- 安全: 防止共享代码中的意外修改
资料来源
作者
列出所有 Python 教程。