Python核心编程学习笔记(9)
Python核心编程学习笔记(九)
29、集合类型
(1) 创建集合,只有唯一的方法——用集合的工厂方法set()(可变集合)和frozenset()(不可变集合)
>>> s = set('cheeseshop') >>> s set(['c', 'e', 'h', 'o', 'p', 's']) >>> t = frozenset('bookshop') >>> t frozenset(['b', 'h', 'k', 'o', 'p', 's']) >>> type(s) <type 'set'> >>> type(t) <type 'frozenset'> >>> len(s) 6 >>> len(s) == len(t) True >>> s == t False
(2) 访问集合中的值
>>> 'k' in s False >>> 'k' in t True >>> 'c' not in t True >>> for i in s: print i c e h o p s
(3) 更新集合
>>> 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'])
只有可变集合能被修改,试图修改不可变集合会引发异常。
>>> t.add('z') Traceback (most recent call last): File "<pyshell#23>", line 1, in <module> t.add('z') AttributeError: 'frozenset' object has no attribute 'add'
(4) 删除集合
调用 del 将他们直接清除出当前的名字空间。如果它的引用计数为零,也会被标记以便被垃圾回收。
>>> del s >>> s Traceback (most recent call last): File "<pyshell#25>", line 1, in <module> s NameError: name 's' is not defined
30、集合类型操作符
(1) 适用于所有集合类型的
- 成员关系(in, not in)
- 集合等价/不等价—— 两个集合相等是指,对每个集合而言,当且仅当其中一个集合中的每个成员同时也是另一个集合中的成员。
- 子集/超集——“小于”符号(<, <=)用来判断子集,“大于”符号(>, >=)用来判断超集。
>>> set('shop') < set('cheeseshop') True >>> set('bookshop') >= set('shop') True
- 联合(|)——联合(union)操作等价于集合的OR(又称可兼析取)。联合符号有一个等价的方法,union()。
- 交集(&)——交集操作可以比作集合的AND(或合取)操作。交集符号有一个等价的方法,intersection()。
- 差补/相对补集(-)——两个集合(s和t)的差补或相对补集是指一个集合C,该集合中的元素,只属于集合s,二不属于集合t。等价方法difference()。
- 对称差分(^)——是集合的XOR(异或)。等价方法为symmetric_difference()。
>>> s = set('cheeseshop') >>> t = frozenset('bookshop') >>> s | t set(['c', 'b', 'e', 'h', 'k', 'o', 'p', 's']) >>> s & t set(['h', 's', 'o', 'p']) >>> s - t set(['c', 'e']) >>> s ^ t set(['b', 'e', 'k', 'c'])
- 混合集合类型操作,上面的示例中,左边的 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,或相反情况),则所产生的结果类型与左操作数的类型相同。
(2) 仅适用于可变集合的
- (union)Update(|=)——从已存在的集合中添加(可能多个)成员,此方法和 update()等价。
>>> s = set('cheeseshop') >>> u = frozenset(s) >>> s |= set('pypi') >>> s set(['c', 'e', 'i', 'h', 'o', 'p', 's', 'y'])
- 保留/交集更新(&=)——保留(或交集更新)操作保留与其他集合的共有成员。此方法和 intersection_update()等价。
>>> s = set(u)
>>> s &= set('shop')
>>> s
set(['h', 's', 'o', 'p'])
- 差更新(-=)——对集合 s 和 t 进行差更新操作 s-=t,差更新操作会返回一个集合,该集合中的成员是集合 s 去除掉集合 t 中元素后剩余的元素。此方法和 difference_update()等价。
>>> s = set(u) >>> s -= set('shop') >>> s set(['c', 'e'])
- 对称差分更新(^=)——对集合s和t进行对称差分更新操作(s^=t),对称差分更新操作会返回一个集合,该集合中的成员仅是原集合 s 或仅是另一集合 t 中的成员。此方法和 symmetric_difference_update()等价。
>>> s = set(u) >>> t = frozenset('bookshop') >>> s ^= t >>> s set(['c', 'b', 'e', 'k'])