1. Python frozenset() 函数

frozenset() 返回一个冻结的集合,冻结后集合不能再添加或删除任何元素。

frozenset() 函数语法:

class frozenset([iterable])
iterable – 可迭代的对象,比如列表、字典、元组等等
返回新的 frozenset 对象,如果不提供任何参数,默认会生成空集合。

示例:

>>> a = frozenset(range(10))     # 生成一个新的不可变集合
>>> a
frozenset([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> b = frozenset('runoob')
>>> b
frozenset(['b', 'r', 'u', 'o', 'n'])

2. set(可变集合)与frozenset(不可变集合)的区别

  • set无序排序且不重复,是可变的,有add(),remove()等方法。既然是可变的,所以它不存在哈希值。基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交集),difference(差集)和sysmmetric difference(对称差集)等数学运算。不支持索引、切片等序列操作,但仍支持成员关系运算符in-not in、推导式等操作。

  • frozenset是冻结的集合,它是不可变的,存在哈希值,好处是它可以作为字典的key,也可以作为其它集合的元素。缺点是一旦创建便不能更改,没有add,remove方法。

2.1 集合创建的区别:

set()和 frozenset()分别用来生成可变和不可变的集合。如果不提供任何参数,默认会生成空集合。如果提供一个参数,则该参数必须是可迭代的,即,一个序列,或迭代器,或支持迭代的一个对象。如:set()函数只能接受迭代器(String、Tuple、List、Dict、set)作为参数。

  • set()创建集合
>>> s = set([1,2,3])
>>> s
set([1, 2, 3])
>>> type(s)
<type 'set'>
>>> s2 = set('jmilk')
>>> s2
set(['i', 'k', 'j', 'm', 'l'])
>>> 
  • frozenset()创建集合
>>> t=frozenset('bookshop')
>>> t
frozenset(['b', 'h', 'k', 'o', 'p', 's'])
>>> 

2.2 更新可变集合的区别:

set()用各种集合内建的方法和操作符添加和删除集合的成员,只有可变集合能被修改。而对于frozenset()函数试图修改不可变集合会引发异常。
- set()

>>> s=set('cheeseshop')
>>> s
set(['c', 'e', 'h', 'o', 'p', 's'])
>>> s.add('z')  #添加
>>> s
set(['c', 'e', 'h', 'o', 'p', 's', 'z'])
>>> s.update()
>>> s
set(['c', 'e', 'h', 'o', 'p', 's', 'z'])
>>> s.update('pypi') #添加
>>> s
set(['c', 'e', 'i', 'h', 'o', 'p', 's', 'y', 'z'])
>>> s.remove('z') #删除
>>> s
set(['c', 'e', 'i', 'h', 'o', 'p', 's', 'y'])
>>> s =s-set('pypi')#删除
>>> s
set(['h', 'c', 'e', 's', 'o'])
>>> del s #删除集合
>>> s
Traceback (most recent call last):File "<stdin>", line 1, in <module>
NameError: name 's' is not defined
>>> 
  • frozenset()
>>> t=frozenset('bookshop')
>>> t
frozenset(['b', 'h', 'k', 'o', 'p', 's'])
>>> t.add('z')
Traceback (most recent call last):File "<stdin>", line 1, in <module>
AttributeError: 'frozenset' object has no attribute 'add'
>>> 

2.3 成员关系 (in, not in)的区别:

set()和 frozenset()在这点上用法相同

  • set()
>>> s=set('cheeseshop')
>>> s
set(['c', 'e', 'h', 'o', 'p', 's'])
>>> 'k' in s
False
>>> 'h' in s
True
  • frozenset()
>>> t
frozenset(['b', 'h', 'k', 'o', 'p', 's'])
>>> 'k' in t
True
>>> 'c' in t
False

2.4 集合等价/不等价的区别:

>>> s=set('cheeseshop')
>>> s
set(['c', 'e', 'h', 'o', 'p', 's'])
>>> t=frozenset('cheeseshop')
>>> t
frozenset(['c', 'e', 'h', 'o', 'p', 's'])
>>> s == t
True
>>> set('posh') == set('shop')
True
>>> 

2.5 子集/超集的区别:

>>> set('posh') == set('shop')
True
>>> set('shop') < set('cheeseshop')
True
>>> frozenset('shop') < set('cheeseshop')
True
>>> set('bookshop') >= set('shop')
True
>>> frozenset('bookshop') >= set('shop')
True
>>> 

2.6 遍历访问集合中的值的无别:

这里可变集合set()和非可变集合frozenset()都支持

>>> s=set('cheeseshop')
>>> for i in s:
...     print i
...
c
e
h
o
p
s
>>> t=frozenset('bookshop')
>>> t
frozenset(['b', 'h', 'k', 'o', 'p', 's'])
>>> for i in t:
...     print i
...
b
h
k
o
p
s
>>> 

2.7 集合类型操作符的区别:

这里set()和frozenset()相同

  • 联合( | )
>>> s
set(['c', 'e', 'h', 'o', 'p', 's'])
>>> t
frozenset(['b', 'h', 'k', 'o', 'p', 's'])
>>> t_1=set('bhm')
>>> s_1=frozenset('cer')
>>> t_1
set(['h', 'b', 'm'])
>>> s_1
frozenset(['c', 'r', 'e'])
>>> s|s_1
set(['p', 'c', 'r', 'e', 'h', 's', 'o'])
>>> t|t_1
frozenset(['p', 's', 'b', 'h', 'k', 'm', 'o'])
>>> s |t
set(['c', 'b', 'e', 'h', 'k', 'o', 'p', 's'])
>>> 
  • 交集(&)
>>> s
set(['c', 'e', 'h', 'o', 'p', 's'])
>>> t
frozenset(['b', 'h', 'k', 'o', 'p', 's'])
>>> s&t
set(['h', 's', 'o', 'p'])
>>> 
  • 差补/相对补集( – )
>>> s
set(['c', 'e', 'h', 'o', 'p', 's'])
>>> t
frozenset(['b', 'h', 'k', 'o', 'p', 's'])
>>> s-t
set(['c', 'e'])  # 该集合中的元素,只属于集合 s,而不属于集合 t
>>> 
  • 对称差分( ^ )
    对称差分是集合的 XOR(又称”异或 “)。得到的集合只能是属于集合 s 或者集合 t的成员,不能同时属于两个集合。
>>> s
set(['c', 'e', 'h', 'o', 'p', 's'])
>>> t
frozenset(['b', 'h', 'k', 'o', 'p', 's'])
>>> s^t
set(['b', 'e', 'k', 'c'])
>>> 
  • 混合集合类型操作
    上面的示例中,左边的 s 是可变集合,而右边的 t 是一个不可变集合. 注意上面使用集合操作运算符所产生的仍然是可变集合,但是如果左右操作数的顺序反过来,结果就不一样了。

如果左右两个操作数的类型相同, 既都是可变集合或不可变集合, 则所产生的结果类型是相同的,但如果左右两个操作数的类型不相同(左操作数是 set,右操作数是 frozenset,或相反情况),则所产生的结果类型与左操作数的类型相同

>>> t
frozenset(['b', 'h', 'k', 'o', 'p', 's'])
>>> s
set(['c', 'e', 'h', 'o', 'p', 's'])
>>> t|s
frozenset(['c', 'b', 'e', 'h', 'k', 'o', 'p', 's'])
>>> s|t
set(['c', 'b', 'e', 'h', 'k', 'o', 'p', 's'])
>>> t-s
frozenset(['k', 'b'])
>>> t^s
frozenset(['c', 'b', 'e', 'k'])
>>> 

2.8 可变集合set()的方法

s.update(t):用 t 中的元素修改 s, 即s 现在包含 s 或 t 的成员
s.intersection_update(t): s 中的成员是共同属于 s 和 t 的元素。
s.difference_update(t): s 中的成员是属于 s 但不包含在 t 中的元素
s.symmetric_difference_update(t) :s 中的成员更新为那些包含在 s 或 t 中,但不是s和t 共有的元素
s.add(obj):在集合 s 中添加对象 obj
s.remove(obj):从集合 s 中删除对象 obj,如果 obj 不是集合 s 中的元素(obj not in s),将引发 KeyError 错误。
s.discard(obj):如果 obj 是集合 s 中的元素,从集合 s 中删除对象 obj
s.pop() :删除集合 s 中的任意一个对象,并返回它
s.clear() :删除集合 s 中的所有元素

2.9 集合类型操作符、函数和方法

  • set()和frozenset()都适用

len(s) :集合基数: 集合 s 中元素的个数
set([obj]) :可变集合工厂函数; obj 必须是支持迭代的,由 obj 中的元素创建集合,否则创建一个空集合
frozenset([obj]):不可变集合工厂函数; 执行方式和 set()方法相同,但它返回的是不可变集合
obj in s 成员测试:obj 是 s 中的一个元素吗?
obj not in s 非成员测试:obj 不是 s 中的一个元素吗?
s == t 等价测试: 测试 s 和 t 是否具有相同的元素?
s != t 不等价测试: 与==相反
s < t (严格意义上)子集测试: s != t 而且 s 中 所 有 的元素都是 t 的成员
s.issubset(t) s <= t 子集测试(允许不严格意义上的子集): s 中所有的元素都是 t 的成员
s > t (严格意义上)超集测试: s != t 而且 t 中所有的元素都是 s 的成员
s.issuperset(t) s >= t 超集测试(允许不严格意义上的超集): t 中所有的元素 都是 s 的成员
s.union(t) s | t 合并操作: s 或 t 中的元素
s.intersec- tion(t) s & t 交集操作: s 和 t 中的元素
s.difference(t) s - t 差分操作: s 中的元素,而不是 t 中的元素
s.symmetric_difference(t)s ^ t 对称差分操作:s 或 t 中的元素,但不是 s 和 t 共有的元素
s.copy() 复制操作:返回 s 的(浅复制)副本

  • 适用于set()集合

s.update(t) s |= t (Union) 修改操作: 将 t 中的成员添加 s。
s.intersection_update(t) s &= t 交集修改操作: s 中仅包括 s 和 t 中共有的成员。
s.difference_update(t) s -= t 差修改操作: s 中包括仅属于 s 但不属于 t 的成员。
s.symmetric_difference_update(t) s ^= t 对称差分修改操作: s 中包括仅属于 s 或仅属于 t 的成员。
s.add(obj) 加操作: 将 obj 添加到 s。
s.remove(obj) 删除操作: 将 obj 从 s 中删除;如果 s 中不存在obj,将引发 KeyError。
s.discard(obj) 丢弃操作: remove() 的 友 好 版 本 - 如果 s 中存在 obj,从 s 中删除它。
s.pop() Pop 操作: 移除并返回 s 中的任意一个元素。
s.clear() 清除操作: 移除 s 中的所有元素。

参考:http://www.jb51.net/article/84869.htm

python中frozenset( )和set()的用法区别相关推荐

  1. Python中的 // 和 / 和 % 的用法区别

    Python中的 // 和 / 和 % 的用法区别

  2. python中几种队列Queue用法区别

    python中使用到的队列模块大致有三个: 1.from queue import Queue 此模块适用于线程间通信,但不能用于进程间通信. 示例代码1:   [注意:此时代码存在错误!!!] im ...

  3. 一分钟看懂Python中的 // 和 / 和 % 的用法区别

    前言 在python的语法中, // 和 / 和 % 均表示的做除法运算,但又有一些区别,下面一一介绍一下. / (常规除) 如: 5 / 2 = 2.5 解释:平常除法是什么结果就是什么结果. // ...

  4. Python学习笔记(一)1.Python中end=和sep=的用法与区别。

    一.Python中end=和sep=的用法与区别: python中常用到的end=和sep=两种参数用法相似,一个是python输出结尾,一个是python输出分割. end: 默认是换行,表示两个字 ...

  5. python中astype用法_浅谈python 中的 type(), dtype(), astype()的区别

    如下所示: 函数 说明 type() 返回数据结构类型(list.dict.numpy.ndarray 等) dtype() 返回数据元素的数据类型(int.float等) 备注:1)由于 list. ...

  6. jquery中this与$(this)的用法区别.

    2019独角兽企业重金招聘Python工程师标准>>> jquery中this与$(this)的用法区别.先看以下代码: $("#textbox").hover( ...

  7. Python中爬虫框架或模块的区别

    Python中爬虫框架或模块的区别,我们在Python的学习过程中,需要不断的总结知识点,这样我们才能进步的更快一些. (1)爬虫框架或模块 Python自带爬虫模块:urllib.urllib2; ...

  8. python的raw_ input是什么意思-对python中raw_input()和input()的用法详解

    最近用到raw_input()和input()来实现即时输入,就顺便找了些资料来看,加上自己所用到的一些内容,整理如下: 1.raw_input() raw_input([prompt]) -> ...

  9. Python中值传递和引用传递区别

    原文:http://blog.csdn.net/xuqiaobo/article/details/72236539 举例,函数参数如果是dic,都不需要返回值,原值就被改变了 def aa(dic): ...

  10. python中str和input_对python中raw_input()和input()的用法详解

    最近用到raw_input()和input()来实现即时输入,就顺便找了些资料来看,加上自己所用到的一些内容,整理如下: 1.raw_input() raw_input([prompt]) -> ...

最新文章

  1. Li‘s 影像组学视频学习笔记(28)-ROI/病灶体积的计算、Li‘s have a solution and plan.
  2. 华为云AIOps实践全面解析
  3. 精彩---rtl8139网卡驱动程序分析
  4. 给初学者的 RxJava2.0 教程 (八)
  5. JavaFX鼠标滚动放大缩小图片
  6. xxl-job 执行结果是空_xxljob dotnet core executor执行器开源
  7. 吴恩达《机器学习》--- Logistic分类
  8. 使用appium时出现的问题
  9. cruzer php sandisk 闪迪u盘量产工具_SanDisk Cruzer Micro(闪迪U盘量产助手)V1.1 最新版
  10. Python3 读取word中的表格,根据表格第一行标题行查找想要的表格
  11. 2021年保育员(中级)考试及保育员(中级)免费试题
  12. 漏电继电器LLJ-100FG/CT45mm/AC220V
  13. 华为linux笔记本i3和i7的区别,华为MateBook 13 i3版性能如何 华为MateBook 13 i3版笔记本上手体验...
  14. h5 Canvas时钟制作
  15. python web论坛_十个基于Python的BBS论坛类开源web框架汇总(附源码地址)
  16. Strerror函数和Perror函数的介绍及使用
  17. 在 SCA Module 中使用 Hibernate 框架实现数据持久层
  18. hr看php简历,HR:“有这样的简历,才值得一见!”
  19. 批处理打开html文件夹,批处理打开网页——可打开大量网页.doc
  20. 国土资发〔2015〕16号 国土资源部关于进一步加强信息化工作统筹的若干意见

热门文章

  1. OpenCV霍夫变换查找圆的实例(附完整代码)
  2. Qt Creator在问题窗格中显示任务列表文件
  3. C语言实现通用堆栈(附完整源码)
  4. QML基础类型之point
  5. 经典C语言程序100例之六四
  6. python考试报名官网安徽_今年优选:芜湖python
  7. Pandas及简单学习
  8. B08_NumPy 广播(Broadcast)
  9. 史上最简单的SpringCloud教程 | 第七篇: 高可用的分布式配置中心(Spring Cloud Config)
  10. 做谷歌地图是获得Map key的方法