Python中set与frozenset方法和区别详解


Posted in Python onMay 23, 2016

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

set无序排序且不重复,是可变的,有add(),remove()等方法。既然是可变的,所以它不存在哈希值。基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交集), difference(差集)和sysmmetric difference(对称差集)等数学运算.

sets 支持 x in set, len(set),和 for x in set。作为一个无序的集合,sets不记录元素位置或者插入点。因此,sets不支持 indexing, 或其它类序列的操作。

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

一、集合的创建

set()和 frozenset()工厂函数分别用来生成可变和不可变的集合。如果不提供任何参数,默认会生成空集合。如果提供一个参数,则该参数必须是可迭代的,即,一个序列,或迭代器,或支持
迭代的一个对象,例如:一个列表或一个字典。

>>> s=set('cheeseshop') 使用工厂方法创建
>>> s
{'h', 'c', 'o', 's', 'e', 'p'}
>>> type(s)
<type 'set'>
>>> s={'chessseshop','bookshop'}直接创建,类似于list的[]和dict的{},不同于dict的是其中的值,set会将其中的元素转换为元组
>>> s
{'bookshop', 'chessseshop'}
>>> type(s)
<type 'set'>

不可变集合创建:

>>> t=frozenset('bookshop')
>>> t
frozenset({'h', 'o', 's', 'b', 'p', 'k'})

二、更新可变集合

用各种集合内建的方法和操作符添加和删除集合的成员:

>>> s.add('z') #添加
>>> 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 -= set('pypi')#删除
>>> s
set(['c', 'e', 'h', 'o', 's'])
>>> del s #删除集合

只有可变集合能被修改。试图修改不可变集合会引发异常。

>>> t.add('z')
Traceback (most recent call last):
File "<stdin>", line , in ?
AttributeError: 'frozenset' object has no attribute 'add'

三、成员关系 (in, not in)

>>> 'k' in s
False
>>> 'k' in t
True
>>> 'c' not in t
True

四、集合等价/不等价

>>> s == t
False
>>> s != t
True
>>> u = frozenset(s)
>>> s == u
True
>>> set('posh') == set('shop')
True

五、子集/超集

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

六、遍历访问集合中的值(可变集合和非可变都支持)

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

七、集合类型操作符(所有的集合类型)

1.联合( | )

两个集合的联合是一个新集合,该集合中的每个元素都至少是其中一个集合的成员,即,属于两个集合其中之一的成员。联合符号有一个等价的方法,union().
 >>> s | t
 set(['c', 'b', 'e', 'h', 'k', 'o', 'p', 's'])

2.交集( & )

你可以把交集操作比做集合的 AND(或合取)操作。两个集合的交集是一个新集合,该集合中的每
 个元素同时是两个集合中的成员,即,属于两个集合的成员。交集符号有一个等价的方法,intersection()
 >>> s & t
 set(['h', 's', 'o', 'p']

3.差补/相对补集( ? )

两个集合(s 和 t)的差补或相对补集是指一个集合 C,该集合中的元素,只属于集合 s,而不属
 于集合 t。差符号有一个等价的方法,difference().
 >>> s - t
 set(['c', 'e'])

4.对称差分( ^ )

和其他的布尔集合操作相似, 对称差分是集合的 XOR(又称"异或 ").
 两个集合(s 和 t)的对称差分是指另外一个集合 C,该集合中的元素,只能是属于集合 s 或者集合 t
 的成员,不能同时属于两个集合。对称差分有一个等价的方法,symmetric_difference().
 >>> s ^ t
 set(['k', 'b', 'e', 'c'])

5.混合集合类型操作

上面的示例中,左边的 s 是可变集合,而右边的 t 是一个不可变集合. 注意上面使用集合操作
 运算符所产生的仍然是可变集合,但是如果左右操作数的顺序反过来,结果就不一样了:
 >>> t | s
 frozenset(['c', 'b', 'e', 'h', 'k', 'o', 'p', 's'])
 >>> t ^ s
 frozenset(['c', 'b', 'e', 'k'])
 >>> t - s frozenset(['k', 'b'])

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

八、可变集合类型的方法

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 中的所有元素

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

函数/方法名 等价运算符 说明

所有集合类型:

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 的(浅复制)副本

仅用于可变集合:

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 中的所有元素

以上所述是小编给大家介绍的Python中set与frozenset方法和区别详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python初学之用户登录的实现过程(实例讲解)
Dec 23 Python
python 地图经纬度转换、纠偏的实例代码
Aug 06 Python
windows下 兼容Python2和Python3的解决方法
Dec 05 Python
python sort、sort_index方法代码实例
Mar 28 Python
python实现淘宝购物系统
Oct 25 Python
django 实现celery动态设置周期任务执行时间
Nov 19 Python
pytorch逐元素比较tensor大小实例
Jan 03 Python
python opencv 检测移动物体并截图保存实例
Mar 10 Python
Python 统计位数为偶数的数字代码详解
Mar 15 Python
解决django 向mysql中写入中文字符出错的问题
May 18 Python
pycharm Tab键设置成4个空格的操作
Feb 26 Python
python基础入门之普通操作与函数(三)
Jun 13 Python
python实现多线程的两种方式
May 22 #Python
python实现简单购物商城
May 21 #Python
python字符串的常用操作方法小结
May 21 #Python
python实现用户登录系统
May 21 #Python
python列表的常用操作方法小结
May 21 #Python
bat和python批量重命名文件的实现代码
May 19 #Python
批处理与python代码混合编程的方法
May 19 #Python
You might like
DIY实用性框形天线
2021/03/02 无线电
php数据结构之顺序链表与链式线性表示例
2018/01/22 PHP
如何在Laravel之外使用illuminate组件详解
2020/09/20 PHP
javascript YUI 读码日记之 YAHOO.util.Dom - Part.4
2008/03/22 Javascript
JQuery this 和 $(this) 的区别
2009/08/23 Javascript
javascript来定义类的规范小结
2010/11/19 Javascript
关于scrollLeft,scrollTop的浏览器兼容性测试
2013/03/19 Javascript
jquery图片播放浏览插件prettyPhoto使用详解
2014/12/19 Javascript
JavaScript通过setTimeout实时显示当前时间的方法
2015/04/16 Javascript
详解Javascript几种跨域方式总结
2017/02/27 Javascript
vue+axios实现登录拦截的实例代码
2017/05/22 Javascript
React通过父组件传递类名给子组件的实现方法
2017/11/13 Javascript
详解node Async/Await 更好的异步编程解决方案
2018/05/10 Javascript
Webstorm2016使用技巧(SVN插件使用)
2018/10/29 Javascript
使用VScode 插件debugger for chrome 调试react源码的方法
2019/09/13 Javascript
Vue的全局过滤器和私有过滤器的实现
2020/04/20 Javascript
JavaScript实现移动端弹窗后禁止滚动
2020/05/25 Javascript
[03:54]Ehome出征西雅图 回顾2016国际邀请赛晋级之路
2016/08/02 DOTA
Python编码时应该注意的几个情况
2013/03/04 Python
Django中实现一个高性能计数器(Counter)实例
2014/07/09 Python
关于你不想知道的所有Python3 unicode特性
2014/11/28 Python
python下调用pytesseract识别某网站验证码的实现方法
2016/06/06 Python
Python中Django 后台自定义表单控件
2017/03/28 Python
Python简单实现自动删除目录下空文件夹的方法
2017/08/29 Python
python使用openpyxl库修改excel表格数据方法
2018/05/03 Python
python高阶爬虫实战分析
2018/07/29 Python
Python实现的拉格朗日插值法示例
2019/01/08 Python
使用Python实现毫秒级抢单功能
2019/06/06 Python
Python中新式类与经典类的区别详析
2019/07/10 Python
python实现切割url得到域名、协议、主机名等各个字段的例子
2019/07/25 Python
Python自省及反射原理实例详解
2020/07/06 Python
魅力惠奢品线上平台:MEI.COM
2016/11/29 全球购物
工作鉴定评语
2014/05/04 职场文书
总经理年会致辞
2015/07/29 职场文书
Angular CLI发布路径的配置项浅析
2021/03/29 Javascript
详解MySQL的主键查询为什么这么快
2022/04/03 MySQL