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'])