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 1, 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
s
e
p >>> t=frozenset('bookshop')
>>> t
frozenset({'h', 'o', 's', 'b', 'p', 'k'})
>>> for i in t:
print(i)
h
o
s
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 中的所有元素

最新文章

  1. iOS 企业设备管理 补充中。。。
  2. Java.io.DataInputStream.readInt()
  3. 打印机问题win7 和xp
  4. MongoDB 字段增长
  5. php字符串常用处理函数(数组的拆分、查找替换)
  6. Lua Table 操作
  7. UIWindow 详解
  8. 通过SqlClr制作Sql自动化批量执行脚本
  9. nginx内置全局变量
  10. java中hashCode()与equals()详解
  11. jquery 只读
  12. @mentions for Users with ActionText; 使用Tribute.js库
  13. 异常java.lang.IllegalArgumentException:attempt to create delete event with null entity
  14. Android中,如何提升Layout的性能?
  15. sql格式化并高亮
  16. osx 10.11 一键制作U盘傻瓜工具最新版 无需任何命令
  17. Docker学习笔记之运行和管理容器
  18. Codeforces 841D Leha and another game about graph - 差分
  19. PHP中cookie思维导图
  20. 6.form表单四种提交方式

热门文章

  1. flash builder 启动ios模拟器失败是什么原因?
  2. 使用NSOperation使用,创建线程中传递多个参数
  3. jQurey基础简介
  4. 黄聪:wordpress如何获取当前分类页面的ID、名称、别名(slug)
  5. 黄聪:Discuz!的SEO优化策略一:如何设置标题 &amp; 如何去掉Powered by Discuz!尾巴
  6. PLSQL_性能优化系列08_Oracle Insert / Direct Insert性能优化
  7. Expert C# 5.0中的Linq部分
  8. webview--网络超时
  9. Java多线程之新类库中的构件DelayQueue
  10. poj 1007 (nyoj 160) DNA Sorting