pin_drop当前位置:知识文库 ❯ 图文
Python不可变集合 - frozenset
一、概述
frozenset 是 Python 内置的不可变集合类型。与 set 不同,frozenset 创建后不能添加、删除或修改元素。由于它是不可变的,因此是可哈希的,可以作为字典的键或集合的元素。frozenset 在需要集合不可变性的场景中非常重要。
二、创建 frozenset
从可迭代对象创建
代码示例
fs = frozenset([1, 2, 3, 4, 5])
print(fs)
print(type(fs))输出:
代码示例
frozenset({1, 2, 3, 4, 5})
<class 'frozenset'>从字符串创建
代码示例
fs = frozenset("hello")
print(fs)输出:
代码示例
frozenset({'h', 'e', 'l', 'o'})空 frozenset
代码示例
empty = frozenset()
print(empty)
print(len(empty))输出:
代码示例
frozenset()
0三、不可变特性
frozenset 不支持任何修改操作:
代码示例
fs = frozenset([1, 2, 3])
fs.add(4)输出:
代码示例
AttributeError: 'frozenset' object has no attribute 'add'
不可用的方法:add、remove、discard、pop、clear、update、intersection_update 等。
四、可用的方法
frozenset 支持所有不修改集合的方法:
代码示例
a = frozenset([1, 2, 3])
b = frozenset([3, 4, 5])
print(a & b)
print(a | b)
print(a - b)输出:
代码示例
frozenset({3})
frozenset({1, 2, 3, 4, 5})
frozenset({1, 2})五、作为字典键
由于 frozenset 是可哈希的,它可以作为字典的键使用:
代码示例
key1 = frozenset(["a", "b"])
key2 = frozenset(["c", "d"])
data = {key1: "值1", key2: "值2"}
print(data[key1])
print(data[frozenset(["a", "b"])])输出:
代码示例
值1
值1六、作为集合元素
frozenset 可以作为其他集合的元素,因为它是可哈希的:
代码示例
inner1 = frozenset([1, 2])
inner2 = frozenset([3, 4])
container = {inner1, inner2}
print(container)输出:
代码示例
{frozenset({1, 2}), frozenset({3, 4})}七、frozenset 与 set 对比
八、注意事项
-
创建后不可修改:
frozenset没有任何修改方法,需要新集合时应创建新的frozenset。 -
运算返回 frozenset:两个
frozenset的运算结果仍然是frozenset。 -
与 set 混合运算:
frozenset与set混合运算时,结果类型取决于左侧操作数。
九、小结
-
frozenset是不可变集合,创建后不能修改。 -
可哈希,可以作为字典键和集合元素。
-
支持所有查询和运算方法,不支持修改方法。
-
适合需要集合不可变性的场景,如字典键、集合嵌套等。
十、练习题
练习1
编写一个函数 group_by_set(items),接收一个列表,将元素按其 frozenset 形式分组。例如 [[1,2], [2,1], [3,4]] 应分为两组。
练习2
使用 frozenset 作为字典键,实现一个缓存系统:以函数参数的集合作为键,缓存函数的计算结果。编写一个简单的记忆化装饰器。
常见问题
frozenset 和 set 的主要区别是什么?
frozenset 是不可变的集合,创建后不能添加、删除或修改元素,因此它是可哈希的,可以作为字典的键或集合的元素;而 set 是可变的,不可哈希,不能作为字典的键。
frozenset 可以作为字典的键吗?
可以。因为 frozenset 是不可变且可哈希的,所以它可以作为字典的键使用。这是 frozenset 最常见的应用场景之一。
frozenset 支持哪些操作方法?
frozenset 支持所有不修改集合的方法,包括 union()、intersection()、difference()、symmetric_difference()、issubset()、issuperset()、isdisjoint() 等,但不支持 add()、remove()、discard() 等修改方法。
小贴士
frozenset 在函数式编程中非常有用,因为它保证了数据的不可变性。当你需要将一组唯一的元素作为字典键,或者需要构建嵌套集合结构时,frozenset 是最佳选择。它与 set 共享相同的底层哈希表实现,因此查找效率同样是 O(1)。
本文涉及AI创作
内容由AI创作,请仔细甄别