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'

不可用的方法:addremovediscardpopclearupdateintersection_update 等。


四、可用的方法

frozenset 支持所有不修改集合的方法:

方法 说明
union() 并集
intersection() 交集
difference() 差集
symmetric_difference() 对称差集
issubset() 子集判断
issuperset() 超集判断
isdisjoint() 是否无交集

代码示例

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 对比

特性 set frozenset
可变性 可变 不可变
可哈希
作为字典键
作为集合元素
修改方法
查询方法
运算方法

八、注意事项

  • 创建后不可修改frozenset 没有任何修改方法,需要新集合时应创建新的 frozenset

  • 运算返回 frozenset:两个 frozenset 的运算结果仍然是 frozenset

  • 与 set 混合运算frozensetset 混合运算时,结果类型取决于左侧操作数。


九、小结

  • 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)。

标签: frozenset 不可变集合 Python集合 可哈希 字典键 Python基础

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Python自动去重创建集合 下一篇: Python if条件语句

poll相关推荐