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)

>>> s={'chessseshop','bookshop'}直接创建,类似于list的[]和dict的{},不同于dict的是其中的值,set会将其中的元素转换为元组

>>> s

{'bookshop', 'chessseshop'}

>>> type(s)

不可变集合创建:

>>> 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 "", 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中set与frozenset方法和区别详解

本文地址: http://www.cppcns.com/jiaoben/python/150911.html

python frozenset_Python中set与frozenset方法和区别详解相关推荐

  1. python中的set方法_Python中set与frozenset方法和区别详解

    set(可变集合)与frozenset(不可变集合)的区别: set无序排序且不重复,是可变的,有add(),remove()等方法.既然是可变的,所以它不存在哈希值.基本功能包括关系测试和消除重复元 ...

  2. python中的content方法_对python requests的content和text方法的区别详解

    问题: 一直在想requests的content和text属性的区别,从print 结果来看是没有任何区别的 看下源码: @property def text(self): ""& ...

  3. python requests中content与text方法的区别

    python requests中content与text方法的区别 目录 python requests中content与text方法的区别 目录 requests的作用 response的常用方法: ...

  4. mysql去重函数的使用方法_MySQL中使用去重distinct方法的示例详解

    一 distinct 含义:distinct用来查询不重复记录的条数,即distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能返回他的目标字段,而 ...

  5. html offsetwidth 字符串宽度,基于js中style.width与offsetWidth的区别(详解)

    作为一个初学者,经常会遇到在获取某一元素的宽度(高度.top值...)时,到底是用 style.width还是offsetWidth的疑惑. 1. 当样式写在行内的时候,如 时,用 style.wid ...

  6. python frozenset_python中set和frozenset有什么异同?

    我们知道集合中改变元素的方法想必大家都知道要用法set,在上篇中已经讲过了不可改变集合的frozenset,那么大家知道这两者有什么异同吗?除了区别,其实两种还有相同的地方,下面我们从定义.构造器.集 ...

  7. Python输出帮助文档的方法及命令详解

    文章目录 写在前面 命令与详解 一些其他用途 写在前面 最近学习Python,发现帮助文档在控制台一页一页翻起来不是很方便,于是试着把帮助文档直接输出并保存为文件,但是发现使用以前的方法 import ...

  8. python函数中可变参数的传递方式是_详解Python函数可变参数定义及其参数传递方式...

    Python函数可变参数定义及其参数传递方式详解 python中 函数不定参数的定义形式如下 1. func(*args) 传入的参数为以元组形式存在args中,如: def func(*args): ...

  9. java socket中的方法_Java中关于Socket的方法与作用详解

    1.java.net.Socket;套接字.封装了TCP通讯协议,使用它可以基于TCP与远端计算机上的服务端应用程序链接并进行通讯. 实例化Socket就是与服务器端建立连接的过程.这里需要传入两个参 ...

最新文章

  1. 【电路】pmic芯片设计细节
  2. tomcat 初始管理用户和密码
  3. win7 64位安装mysql教程视频_64位Win7系统安装Mysql 5.7.22图文教程
  4. 游戏行业中的职位:你可以做什么
  5. SAP S/4HANA生产订单创建时使用的工厂数据是从什么地方带出来的 1
  6. 前端学习(541):node得优势
  7. pytorch入门使用
  8. 谈均值、方差、标准差、协方差的概念及意义
  9. #自定义多级菜单_怎么搞定排版中的多级列表问题?
  10. 一本通1623Sherlock and His Girlfriend
  11. 禁止ultraiso开机自动加载镜像
  12. php爬虫伪造请求头,Nodejs 伪造IP 爬取图片
  13. Industrial Design System v4.5 1CD(工业产品设计软件)
  14. unity漂移 unity3d教程 // WheelCollider
  15. Modern Robotics:机器人的构型空间
  16. 去百度还是去创新工厂? 信开复还是信彦宏?
  17. 关于阿里云服务器购买和域名购买的相关流程
  18. (4) epics 中新建一个ioc的整体过程
  19. 气液增压缸用于风扇叶铆钉铆接(产品试压)
  20. kotlin杂谈系列十二(Kotlin和Java的互操作)

热门文章

  1. smartctl 硬盘信息查询
  2. 【BI应用案例】大都会人寿活跃分析经济时代的秘密武器
  3. modelsim 仿真xilinx (vivado2018.2)原语 方法及问题记录
  4. JS数组中的方法 flat(),flatMap()
  5. 开机启动cmd程序并执行指令
  6. MySQL HAVING用法
  7. HD 2187 悼念512汶川大地震遇难同胞——老人是真饿了 【背包问题】
  8. 图灵成立七周年——七年IT畅销图书回顾
  9. Codeforces Testing Round #16 (Unrated)C (集合)
  10. qmx工作室秋季项目作品---2048小游戏