Chinaunix首页 | 论坛 | 博客
  • 博客访问: 253507
  • 博文数量: 44
  • 博客积分: 1052
  • 博客等级: 少尉
  • 技术积分: 742
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-17 16:51
文章分类

全部博文(44)

文章存档

2013年(7)

2012年(14)

2011年(23)

分类: Python/Ruby

2011-09-05 21:07:23

集合set
主要是将数学里的集合概念搬到这里来了。
集合中的元素要求是可哈希的。
分为:可变集合(set)和不可变集合(frozenset)
可变集合不可哈希,不可变集合可哈希

1:集合的创建与赋值
集合只能用工厂函数set()和frozenset()来创建。没有类似与列表的[]和字典的{}。
可以用set()创建空的集合,也可以用set(iterable)来创建集合
  1. >>> set('hello world')
  2. set([' ', 'e', 'd', 'h', 'l', 'o', 'r', 'w'])
  3. >>> a = set()
  4. >>> a
  5. set([])
  6. >>> d = {1:'a', 2:'b', 3:'c', 4:'d'}
  7. >>> s = set(d)               # 用字典创建集合
  8. >>> s
  9. set([1, 2, 3, 4])
  10. >>> dict.fromkeys(s)         # 用集合创建字典
  11. {1: None, 2: None, 3: None, 4: None}
  12. >>>

2:集合的访问
集合是可以迭代的
  1. >>> 1 in s
  2. True
  3. >>> 5 in s
  4. False
  5. >>> for i in s:
  6. ... print i,'\t',
  7. ...
  8. 1     2     3     4     >>>
  9. >>>

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)
  1. >>> s=set('cheeseshop')
  2. >>> t = frozenset('bookshop')
  3. >>> s
  4. set(['c', 'e', 'h', 'o', 'p', 's'])
  5. >>> t
  6. frozenset(['b', 'h', 'k', 'o', 'p', 's'])
  7. >>> s|t                                       # 并
  8. set(['c', 'b', 'e', 'h', 'k', 'o', 'p', 's'])
  9. >>> s&t                                       # 交
  10. set(['h', 's', 'o', 'p'])
  11. >>> s-t                                       # 差
  12. set(['c', 'e'])
  13. >>> t-s
  14. frozenset(['k', 'b'])
  15. >>> s^t                                       # 对称差分
  16. set(['b', 'e', 'k', 'c'])
  17. >>> t^s                                       # 改变顺序后,结果的类型也变了。
  18. frozenset(['c', 'b', 'e', 'k'])
  19. >>> t|s
  20. frozenset(['c', 'b', 'e', 'h', 'k', 'o', 'p', 's'])
  21. >>> t&s
  22. frozenset(['h', 's', 'o', 'p'])
  23. >>>
也有&=, |=, ^=, -=操作符,这些操作符的左值就只能是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中所有元素

虽然上面一些函数与对应的操作符等价,但其实并不完全等价。
如:
  1. >>> s = set('hello')
  2. >>> t = set('world')
  3. >>> s.union('world')
  4. set(['e', 'd', 'h', 'l', 'o', 'r', 'w'])
  5. >>> s|t
  6. set(['e', 'd', 'h', 'l', 'o', 'r', 'w'])
  7. >>> s|'world'
  8. Traceback (most recent call last):
  9.   File "", line 1, in <module>
  10. TypeError: unsupported operand type(s) for |: 'set' and 'str'
  11. >>>
这说明在用操作符的时候,两边要求都是集合类型,但用函数的时候,函数参数不一定是集合类型。

阅读(1300) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~