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 23 Python
浅析Python中return和finally共同挖的坑
Aug 18 Python
python抓取网页中链接的静态图片
Jan 29 Python
Flask-Mail用法实例分析
Jul 21 Python
pyqt5 实现工具栏文字图片同时显示
Jun 13 Python
解决python中使用PYQT时中文乱码问题
Jun 17 Python
python 正则表达式参数替换实例详解
Jan 17 Python
python发qq消息轰炸虐狗好友思路详解(完整代码)
Feb 15 Python
python 实现表情识别
Nov 21 Python
python 解决函数返回return的问题
Dec 05 Python
python字典进行运算原理及实例分享
Aug 02 Python
pytorch中的 .view()函数的用法介绍
Mar 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
咖啡豆的最常见发酵处理方法,详细了解一下
2021/03/03 冲泡冲煮
PHP 一个比较完善的简单文件上传
2010/03/25 PHP
php下关于中英数字混排的字符串分割问题
2010/04/06 PHP
CURL的学习和应用(附多线程实现)
2013/06/03 PHP
深入file_get_contents与curl函数的详解
2013/06/25 PHP
PHP strstr 函数判断字符串是否否存在的实例代码
2013/09/28 PHP
PHP实现登录搜狐广告获取广告联盟数据的方法【附demo源码】
2016/10/14 PHP
PHP实现创建一个RPC服务操作示例
2020/02/23 PHP
javascript+html5实现绘制圆环的方法
2015/07/28 Javascript
JavaScript基本数据类型及值类型和引用类型
2015/08/25 Javascript
BootstrapTable+KnockoutJS自定义T4模板快速生成增删改查页面
2016/08/01 Javascript
微信小程序 购物车简单实例
2016/10/24 Javascript
JavaScript实现简单评论功能
2017/08/17 Javascript
js用类封装pop弹窗组件
2017/10/08 Javascript
详解Vue改变数组中对象的属性不重新渲染View的解决方案
2018/09/21 Javascript
mpvue+vuex搭建小程序详细教程(完整步骤)
2018/09/30 Javascript
微信小程序入门之指南针
2020/10/22 Javascript
python中的编码知识整理汇总
2016/01/26 Python
Python中绑定与未绑定的类方法用法分析
2016/04/29 Python
Python语言描述机器学习之Logistic回归算法
2017/12/21 Python
解决Matplotlib图表不能在Pycharm中显示的问题
2018/05/24 Python
在mac下查找python包存放路径site-packages的实现方法
2018/11/06 Python
Python实现获取汉字偏旁部首的方法示例【测试可用】
2018/12/18 Python
在自动化中用python实现键盘操作的方法详解
2019/07/19 Python
HTML5如何为形状图上颜色怎么绘制具有颜色和透明度的矩形
2014/06/23 HTML / CSS
韩国知名的家庭购物网站:CJmall
2016/08/01 全球购物
ParcelABC西班牙:包裹运送和快递服务
2019/12/24 全球购物
BSTN意大利:德国街头和运动文化高品质商店
2020/12/22 全球购物
研究生自荐信
2013/10/09 职场文书
人代会标语
2014/06/30 职场文书
征用土地赔偿协议书
2014/09/26 职场文书
个人查摆剖析材料
2014/10/16 职场文书
庆七一活动简报
2015/07/20 职场文书
五星级酒店宣传口号
2015/12/25 职场文书
2016年先进班集体事迹材料
2016/02/26 职场文书
Python序列化与反序列化相关知识总结
2021/06/08 Python