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实现应用程序在右键菜单中添加打开方式功能
Jan 09 Python
解决使用pycharm提交代码时冲突之后文件丢失找回的方法
Aug 05 Python
详解python的四种内置数据结构
Mar 19 Python
使用python判断jpeg图片的完整性实例
Jun 10 Python
python获取点击的坐标画图形的方法
Jul 09 Python
Python 实现文件读写、坐标寻址、查找替换功能
Sep 11 Python
python实现的按要求生成手机号功能示例
Oct 08 Python
基于python3监控服务器状态进行邮件报警
Oct 19 Python
Django框架模板用法入门教程
Nov 04 Python
python使用docx模块读写docx文件的方法与docx模块常用方法详解
Feb 17 Python
在pycharm中使用matplotlib.pyplot 绘图时报错的解决
Jun 01 Python
Python编写可视化界面的全过程(Python+PyCharm+PyQt)
May 17 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
php 中文和编码判断代码
2010/05/16 PHP
PHP获取文本框、密码域、按钮的值实例代码
2017/04/19 PHP
JavaScript Sort 表格排序
2009/10/31 Javascript
javascript 操作select下拉列表框的一点小经验
2010/03/20 Javascript
浅析JavaScript函数的调用模式
2016/08/10 Javascript
canvas知识总结
2017/01/25 Javascript
Angular.Js之Scope作用域的学习教程
2017/04/27 Javascript
微信小程序中input标签详解及简单实例
2017/05/18 Javascript
react-router JS 控制路由跳转实例
2017/06/15 Javascript
lhgcalendar时间插件限制只能选择三个月的实现方法
2017/07/03 Javascript
angular中实现li或者某个元素点击变色的两种方法
2017/07/27 Javascript
nodejs同步调用获取mysql数据时遇到的大坑
2019/03/02 NodeJs
详解vue项目中使用token的身份验证的简单实践
2019/03/08 Javascript
three.js中多线程的使用及性能测试详解
2021/01/07 Javascript
[41:52]2018DOTA2亚洲邀请赛3月29日 小组赛A组 TNC VS OpTic
2018/03/30 DOTA
python发布模块的步骤分享
2014/02/21 Python
Python中计算三角函数之cos()方法的使用简介
2015/05/15 Python
批量获取及验证HTTP代理的Python脚本
2017/04/23 Python
python实现百度语音识别api
2018/04/10 Python
Python操作配置文件ini的三种方法讲解
2019/02/22 Python
Python字典的基本用法实例分析【创建、增加、获取、修改、删除】
2019/03/05 Python
Python3.8中使用f-strings调试
2019/05/22 Python
ipad上运行python的方法步骤
2019/10/12 Python
安装2019Pycharm最新版本的教程详解
2019/10/22 Python
selenium+python配置chrome浏览器的选项的实现
2020/03/18 Python
Python文本文件的合并操作方法代码实例
2020/03/31 Python
捐书活动总结
2014/05/04 职场文书
美国留学经济担保书
2014/05/20 职场文书
党的群众路线对照检查材料
2014/09/22 职场文书
2014年班组工作总结
2014/11/20 职场文书
2014年信息中心工作总结
2014/12/17 职场文书
房地产销售员岗位职责
2015/04/11 职场文书
催款函怎么写
2015/06/24 职场文书
详解Java实践之建造者模式
2021/06/18 Java/Android
十大好看的穿越动漫排名:《瑞克和莫蒂》第一,国漫《有药》在榜
2022/03/18 日漫
Python采集爬取京东商品信息和评论并存入MySQL
2022/04/12 Python