Python中使用Frozenset对象的案例详解
作者:吴欣 发布时间:2023-09-27 09:36:32
这篇文章将介绍在Python中使用 "frozenset "函数的指南,该函数返回一个新的frozenset类型的Python对象。这些对象类似于Python中的set对象,但有一些关键的区别。本文的所有代码样本都是在Ubuntu 21.04上用Python 3.9.5测试的。
关于Frozensets
frozenset 函数接收一个可迭代类型的 Python 对象的参数,并返回一个新的 frozenset 类型的 Python 对象。一个 frozenset 类型的对象是一个可散列的、不可改变的 Python 对象,其元素在整个生命周期内是冻结的或不可改变的。与元素可以随时改变的集合类型的Python对象相反,frozenset中的所有项目都保持不变。frozensets 的用法可以通过例子得到最好的理解。下面将解释其中的一些。
创建一个新的Frozenset对象
要获得一个新的 frozenset类型的对象,只需提供任何可迭代的类型作为frozenset函数的可选参数。下面是一个代码示例。
l = [1, 2, 3, 4]
fset = frozenset(l)
print (fset)
print (type(fset))
代码中的第一条语句定义了一个新的列表,它被简单地称为 "l"。接下来,通过调用frozenset函数并提供列表作为参数,创建了一个新的frozenset对象。运行上述代码示例后,你应该得到以下输出。
frozenset({1, 2, 3, 4})
<class 'frozenset'>
正如你在输出中看到的,fset是一个frozenset类型的对象,它使用了Python中set也使用的大括号语法。Frozenset只包含唯一的项目,因为不允许有重复的项目,这一点与Python的set类型对象非常相似。每个frozenset类型的对象都是一个 Python 集合,但反之亦然,因为集合项可以通过调用一些方法来改变。注意,你可以通过调用没有任何参数的frozenset函数来创建一个空的frozenset。
一旦创建了Frozenset,你就不能修改它了
如前所述,一个frozenset类型的对象有一些项目,在其生命周期内不会改变。虽然你可以用 frozenset 类型对象使用 Python 集合的方法,但是如果你试图使用改变原始frozenset对象本身的方法,就会出现错误。下面是一个例子。
l = [1, 2, 3, 4]
new_set = set(l)
new_set.remove(1)
print (new_set)
fset = frozenset(l)
fset.remove(1)
在上面的代码示例中,有两条语句调用了集合类型对象的 "删除"方法。虽然一个项目被成功地从 "new_set"中删除,但当对 "fset"调用remove方法时,却抛出了一个错误。运行上述代码示例后,你应该得到以下输出。
{2, 3, 4}
Traceback (most recent call last):
File "main.py", line 9, in <module>
fset.remove(1)
AttributeError: 'frozenset' object has no attribute 'remove'
其他类似的方法,如 "add"、"pop"、"clear"、"discard "等,对forzensets不起作用。
与 Frozensets 一起使用的方法
所有不修改集合项的 Python 集合方法都对frozenset类型的对象有效。所以你可以比较两个frozenset的等价或不等价,迭代/循环它们,获得两个frozenset之间的共同或唯一元素,等等。下面是一个例子,显示了一些与frozensets有关的方法。
fset1 = frozenset([1, 2, 3, 4])
fset2 = frozenset([3, 4, 5, 6])
print (fset1.intersection(fset2))
print (fset1.union(fset2))
print (fset1.difference(fset2))
print (len(fset1))
print (len(fset2))
这些代码是不言自明的。一些不改变原始frozensets值的方法已经被调用。这些方法主要用于比较两个不同frozensets的元素。运行上述代码样本后,你应该得到以下输出。
frozenset({3, 4})
frozenset({1, 2, 3, 4, 5, 6})
frozenset({1, 2})
4
4
其他一些处理冻结集的方法有:"issubset"、"issuperset"、"symmetric_difference"、"copy",等等。像">"、"<"、">="和"<="这样的等价运算符也适用于frozenset类型对象。
Frozenset可以被转换为其他可迭代类型
你可以通过调用它们的主构造函数将frozenset类型的对象转换为其他可迭代的对象。下面的代码示例显示了将frozenset类型对象转换为list、tuple和set类型对象。
fset = frozenset([1, 2, 3, 4])
print (list(fset))
print (tuple(fset))
print (set(fset))
运行上述代码样本后,你应该得到以下输出。
[1, 2, 3, 4]
(1, 2, 3, 4)
{1, 2, 3, 4}
Frozenset使用案例
由于frozenset对象只不过是不可改变的/不可变的集合类型的 Python 对象,你可能会想知道它们的效用,因为集合总是可以被用来代替它们。frozenset最明显的用例是用于声明具有独特元素的集合类型对象,而没有在代码中意外改变它们的风险。Frozenset类型的对象可以被用作字典的键,而集合则不能用于同样的目的。由于frozenset是可散列的,它们可以在集合内使用,而集合不能插入到另一个集合中。看一下下面的代码。
fset = frozenset({4, 5})
s = {1, 2, fset}
print (s)
s = {1, 2, {4, 5}}
在第二条语句中,一个frozenset已经在创建过程中被添加到一个集合中。在最后一条语句中,一个集合类型的对象被用在另一个集合里面。运行上述代码示例后,你应该得到以下输出。
{frozenset({4, 5}), 1, 2}
Traceback (most recent call last):
File "main.py", line 27, in <module>
s = {1, 2, {4, 5}}
TypeError: unhashable type: 'set'
正如你在输出中看到的,forzensets可以被添加到其他集合中。另一方面,将一个集合添加到另一个集合中会产生一个错误,因为集合只接受可散列类型的项目。
来源:https://juejin.cn/post/7125728094404476935
猜你喜欢
- 代理模式的优点代理模式可以保护原对象,控制对原对象的访问;代理模式可以增强原对象的功能,通过代理对象来添加一些额外的功能;代理模式可以提高系
- 对于 link 元素 和 style 元素 我相信大家都比较了解,但对于他们的出现位置可能有误解。在 淘宝 的所有频道中出现这样一个问题:频
- 什么是deferdefer用来声明一个延迟函数,把这个函数放入到一个栈上, 当外部的包含方法return之前,返回参数到调用方法之前调用,也
- JSP 注释的详解及简单实例一 三种格式二 举例 <body> <h1>大家好</h1
- 本文主要介绍了ASP连接11种数据库的常用语法,详细内容请参考下文:1.Access数据库的DSN-less连接方法:set adocon=
- 之前用 copy 不多,本以为它是个很方便的函数,没想到在做练习题时竟还是被它坑了。是我对他期望太多了。func copy(dst, src
- PHP count_chars() 函数实例返回一个字符串,包含所有在 "Hello World!" 中使用过的不同字符
- SQL*Plus system/manager 2、显示当前连接用户 SQL> show user 3、查看系统拥有哪些用户 SQL&
- 第一步:登陆root用户。第二步:新建一个数据表,并且选好排序规则,此处我使用testtable。第三步:我们新建一个用户输入相关的账户名以
- 本篇,我们学习PyQt5界面中拖放(Drag 和Drop)控件。拖放动作在GUI中,拖放指的是点击一个对象,并将其拖动到另一个对象上的动作。
- 这篇文章主要介绍了微信小程序wxml列表渲染原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友
- window.onload=function() {&
- 因为主键可以唯一标识某一行记录,所以可以确保执行数据更新、删除的时候不会出现张冠李戴的错误。当然,其它字段可以辅助我们在执行这些操作时消除共
- 困扰我很久问题终于在昨天被解决了。其实问题很简单<% =now %>老是显示12小时制,总是出现上午、下午。这个问题虽然很小,但
- 运维平台导入数据这一功能实在是太重要了,我敢说在没有建自己的cmdb平台前,大多数公司管理服务器信息肯定是表格,用表格最麻烦的就是有点更新就
- 本文实例讲述了PHP面向对象程序设计类的定义与用法。分享给大家供大家参考,具体如下:<?phpclass Person {  
- 前言首先要明确Go语言中实质只有值传递,引用传递和指针传递是相对于参数类型来说。个人认为上诉的结论不对,把引用类型看做对指针的封装,一般封装
- 今天帮一同学导入一个excel数据,我把excel保存为txt格式,然后建表导入,失败!分隔符格式不匹配,无法导入!!!!怎么看两边都是\t
- 在windows操作系统上使用IE作为浏览器时。常常会发生这样的问题:在浏览使用UTF-8编码的网页时,浏览器无法自动侦测(即没有设定“自动
- 前言我在使用mac安装virtualwrapper的时候遇到了问题,搞了好长时间,才弄好,在这里总结一下分享出来,供遇到相同的问题的朋友使用