集合set
主要是将数学里的集合概念搬到这里来了。
集合中的元素要求是可哈希的。
分为:可变集合(set)和不可变集合(frozenset)
可变集合不可哈希,不可变集合可哈希
1:集合的创建与赋值
集合只能用工厂函数set()和frozenset()来创建。没有类似与列表的[]和字典的{}。
可以用set()创建空的集合,也可以用set(iterable)来创建集合
- >>> set('hello world')
-
set([' ', 'e', 'd', 'h', 'l', 'o', 'r', 'w'])
-
>>> a = set()
-
>>> a
-
set([])
-
>>> d = {1:'a', 2:'b', 3:'c', 4:'d'}
-
>>> s = set(d) # 用字典创建集合
-
>>> s
-
set([1, 2, 3, 4])
-
>>> dict.fromkeys(s) # 用集合创建字典
-
{1: None, 2: None, 3: None, 4: None}
-
>>>
2:集合的访问
集合是可以迭代的
- >>> 1 in s
-
True
-
>>> 5 in s
-
False
-
>>> for i in s:
-
... print i,'\t',
-
...
-
1 2 3 4 >>>
-
>>>
3:更新集合
对集合的更新用到集合的一些函数和操作符。下表描述集合操作符和关系符号
符号 说明
a in s a 是 s的成员,返回True
a not in s
s1 == s2 两个集合相等
s1 != s2 不等
s1 < s2 为True:s1是s2的真子集
s1 <= s2 为True:s1是s2的子集
s1 > s2 为True:s1是s2的真超集
s1 >= s2 为True:s1是s2的超集
s1 & s2 求s1与s2的交集
s1 | s2 求s1与s2的并集
s1 - s2 求s1与s2的差集
s1 ^ s2 求s1与s2的对称差分
操作符
1:标准类型操作符
标准类型操作符:in, not in, 关系操作符
由上面可知关系操作符在集合中有其他意思。
2:集合类型操作符
& 交, | 并, - 差, ^ 对称差分。
s ^ t得到的结果集合中的元素要么属于s要么属于t。所以 s^t = (s-t)|(t-s)
- >>> s=set('cheeseshop')
-
>>> t = frozenset('bookshop')
-
>>> s
-
set(['c', 'e', 'h', 'o', 'p', 's'])
-
>>> t
-
frozenset(['b', 'h', 'k', 'o', 'p', 's'])
-
>>> s|t # 并
-
set(['c', 'b', 'e', 'h', 'k', 'o', 'p', 's'])
-
>>> s&t # 交
-
set(['h', 's', 'o', 'p'])
-
>>> s-t # 差
-
set(['c', 'e'])
-
>>> t-s
-
frozenset(['k', 'b'])
-
>>> s^t # 对称差分
-
set(['b', 'e', 'k', 'c'])
-
>>> t^s # 改变顺序后,结果的类型也变了。
-
frozenset(['c', 'b', 'e', 'k'])
-
>>> t|s
-
frozenset(['c', 'b', 'e', 'h', 'k', 'o', 'p', 's'])
-
>>> t&s
-
frozenset(['h', 's', 'o', 'p'])
-
>>>
也有&=, |=, ^=, -=操作符,这些操作符的左值就只能是set类型,而不能是frozenset类型的。
内建函数
1:标准内建函数
len():返回集合的基数,即元素的个数
2:集合类型函数
set(), frozenset()两个工厂函数
3:内建方法
i)同时适用于set和frozenset的
s.issubset(t): 等价于s<=t
s.issuperset(t): 等价于s>=t
s.union(t): 等价于s|t
s.intersection(t): 等价于s&t
s.difference(t): 等价于s-t
s.symmetric_difference(t): 等价于s^t
s.copy(): 复制一份s的拷贝
ii)仅适用于set类型
s.update(t): 等价于s|=t
s.intersection_update(t): 等价于s&=t
s.difference_update(t): 等价于s-=t
s.symmetric_difference_update(t): 等价于s^=t
s.add(obj): 在s中添加obj
s.remove(obj): 在s中删除obj,若obj不在s中,则KeyError错误
s.discard(obj): 如果obj在s中,则删除obj
s.pop(): 删除集合中任意一个元素,并返回它
s.clear(): 删除s中所有元素
虽然上面一些函数与对应的操作符等价,但其实并不完全等价。
如:
- >>> s = set('hello')
-
>>> t = set('world')
-
>>> s.union('world')
-
set(['e', 'd', 'h', 'l', 'o', 'r', 'w'])
-
>>> s|t
-
set(['e', 'd', 'h', 'l', 'o', 'r', 'w'])
-
>>> s|'world'
-
Traceback (most recent call last):
-
File "", line 1, in <module>
-
TypeError: unsupported operand type(s) for |: 'set' and 'str'
-
>>>
这说明在用操作符的时候,两边要求都是集合类型,但用函数的时候,函数参数不一定是集合类型。
阅读(1300) | 评论(0) | 转发(0) |