python学习[第十二篇] 数据类型之 集合
python学习[第十二篇] 数据类型之 集合
集合概念
python中集合是一组无序排列的哈希值。集合分为两种可变集合(set)和不可变集合(frozenset)
对可变集合可以修改和删除元素,对于不可变集合不允许。可变集合是不可以哈希的,因此既不能用作字典的键,也不能做其他集合的元素。
集合的增删改查
集合的创建于赋值
集合与列表([]) 和字典({})不同,集合没有特别的语法格式。列表和字典可以通过他们自己的工厂方法创建,这也是集合的唯一的创建方式。set()和frozenset()
#创建可变集合 >>> s=set('fruittruth') >>> s set(['f', 'i', 'h', 'r', 'u', 't']) #第二种方法是用{} >>> x={1,2,3} >>> type(x) <type 'set'> #创建不可变集合 >>> t=frozenset('fruittruth') >>> t frozenset(['f', 'i', 'h', 'r', 'u', 't']) >>> type(s) <type 'set'> >>> type(t) <type 'frozenset'>
访问集合
#判断对象是否在集合中 >>> 't' in s True #判断对象是否不在集合中 >>> 'k' not in s True #变量集合的元素 >>> for i in s: ... print i ... f i h r u t
更新集合
使用集合的内建方法和操作符添加和删除集合的元素
#16b #25b #31 #42 #53b #64 #75b ##16b #集合添加元素 >>> s.add('k') >>> s set(['f', 'i', 'h', 'k', 'r', 'u', 't']) #集合修改元素 >>> s.update('xyz') >>> s set(['f', 'i', 'h', 'k', 'r', 'u', 't', 'y', 'x', 'z']) #集合删除元素 remove方法 >>> s.remove('t') >>> s set(['f', 'i', 'h', 'k', 'r', 'u', 'y', 'x', 'z']) #通过 -= 删除集合 要删除的只能是集合,可以是可变集合和不可变集合 s -= set('xxx') >>> s -= set('xyz') >>> s set(['f', 'i', 'h', 'k', 'r', 'u']) >>> s -= t >>> s set(['k']) >>> s -= 'xyz' Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for -=: 'set' and 'str'
删除集合
del s
集合类型操作符
标准类型操作符
成员关系 in ,not in
>>> s=set('pzq') >>> s set(['q', 'p', 'z']) >>> >>> 'k' in s False
集合等价及不等价
>>> s=set('pzq') >>> s set(['q', 'p', 'z']) >>> t=frozenset('mon') >>> t frozenset(['m', 'o', 'n']) >>> s == t False >>> s != t True >>> u=frozenset(s) >>> u frozenset(['q', 'p', 'z']) >>> s == u True >>> set('posh') == set('shop') True
子集及超集
集合子集及超集 :小于符号(<,<=)用来表示子集 大于符号(>,>=)用来表示超集.
集合类型操作符(所有类型操作符:可变可不变) 对等号左边集合直接进行修改
联合操作符 |
交集操作符 &
差集操作符 -
对称差分 ^
>>> x=set(['xxx','yyy']) >>> x set(['xxx', 'yyy']) >>> y=set(['xxx','zzz']) >>> y set(['xxx', 'zzz']) >>> x|y set(['xxx', 'yyy', 'zzz']) >>> x&y set(['xxx']) >>> x-y set(['yyy']) >>> y-x set(['zzz']) >>> x^y set(['yyy', 'zzz'])
集合类型操作符(所有类型操作符:可变集合)
(union)update |= 更新方法从已存在的集合中添加一个或多个成员同update()等价
Retention/Intersection update &= 保留与其他集合共有的成员 和intersecion_update()等价
Difference update -= 差更新操作 ,删除共同存在的元素后返回的集合, difference_update()等价
Symmetric difference update ^= 等差操作返回的集合 和 symmetric_difference_update()等价
# 操作符 l= >>> x = set(['xxx','yyy']) >>> y = set(['xxx','zzz']) >>> x,y (set(['xxx', 'yyy']), set(['xxx', 'zzz'])) >>> x |= y >>> x,y (set(['xxx', 'yyy', 'zzz']), set(['xxx', 'zzz'])) # 操作符 &= >>> x = set(['xxx','yyy']) >>> y = set(['xxx','zzz']) >>> x,y (set(['xxx', 'yyy']), set(['xxx', 'zzz'])) >>> x &= y >>> x,y (set(['xxx']), set(['xxx', 'zzz'])) #操作符 -= >>> x = set(['xxx','yyy']) >>> y = set(['xxx','zzz']) >>> x,y (set(['xxx', 'yyy']), set(['xxx', 'zzz'])) >>> x -= y >>> x,y (set(['yyy']), set(['xxx', 'zzz'])) >>> #操作符 ^= >>> x = set(['xxx','yyy']) >>> y = set(['xxx','zzz']) >>> x,y (set(['xxx', 'yyy']), set(['xxx', 'zzz'])) >>> x ^= y >>> x,y (set(['yyy', 'zzz']), set(['xxx', 'zzz']))
内建函数
标准类型内建函数
len() 返回集合的基数
type() 返回参数类型
str() 转为字符串
repr() 转为python字符串
集合类型工厂函数
set() 生成可变类型集合
frozenset() 生成不可变类型集合
集合类型内建方法
所有集合的方法
s.issubset(t) 判断是是否是t的子集
s.issuperset(t) 判断s是否是t的超集
s.union(t) 返回一个新的集合 ,是s和t的并集
s.intersecion(t) 返回一个新的集合,是s和t的差集
s.defference(t) 返回一个新的集合,是s的成员,但不是t的成员
s.symmetric_difference(t) 返回一个新的集合 ,是s或t的成员,但不是s和t的共有成员
s.copy()
#判断是否是超集和子集 >>> s=set(['xxx']) >>> t=set(['xxx','yyy']) >>> s,t (set(['xxx']), set(['xxx', 'yyy'])) >>> s.issubset(t) True >>> t.issuperset(t) True #集合的交集并集差集,对称差 >>> s=set(['xxx','zzz']) >>> t=set(['xxx','yyy']) >>> s,t (set(['xxx', 'zzz']), set(['xxx', 'yyy'])) >>> s.union(t) set(['xxx', 'yyy', 'zzz']) >>> s.intersection(t) set(['xxx']) >>> s.difference(t) set(['zzz']) >>> s.symmetric_difference(t) set(['yyy', 'zzz'])
可变集合的方法
基础的增删改查
s.add(obj)
s.remove(obj)
s.discard(obj)
s.pop()
s.clear()
#基础的增删改查 >>> s=set(['xxx']) >>> s set(['xxx']) #添加的对象必须是可hash的,不可以是列表 >>> s.add(['zzz']) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list' >>> s set(['xxx']) #元组可以hash加入成功 >>> s.add(('zzz')) >>> s set(['xxx', 'zzz']) #remove方法如果删除的子集不存在会报keyerror >>> s.remove(('z')) Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'z' #discard 方法 子集不存在的话不会报keyerror >>> s.discard(('z')) >>> s set(['xxx', 'zzz']) #pop返回第一个自己并删除 >>> s.pop() 'xxx' >>> s set(['zzz']) #clear 清空集合 >>> s.clear() >>> s set([])
集合的交集并集差集
s.update(t)
s.intersection_update(t)
s.defference_update(t)
s.symmetric_difference_update(t)
>>> s = set(('xxx','zzz')) >>> t = set(['xxx','yyy']) >>> s, t (set(['xxx', 'zzz']), set(['xxx', 'yyy'])) >>> s.update(t) >>> s, t (set(['xxx', 'yyy', 'zzz']), set(['xxx', 'yyy'])) >>> s = set(('xxx','zzz')) >>> t = set(['xxx','yyy']) >>> s, t (set(['xxx', 'zzz']), set(['xxx', 'yyy'])) >>> s.intersection_update(t) >>> s, t (set(['xxx']), set(['xxx', 'yyy'])) >>> s = set(('xxx','zzz')) >>> t = set(['xxx','yyy']) >>> s, t (set(['xxx', 'zzz']), set(['xxx', 'yyy'])) >>> s.difference_update(t) >>> s, t (set(['zzz']), set(['xxx', 'yyy'])) >>> s = set(('xxx','zzz')) >>> t = set(['xxx','yyy']) >>> s, t (set(['xxx', 'zzz']), set(['xxx', 'yyy'])) >>> s.symmetric_difference_update(t) >>> s, t (set(['yyy', 'zzz']), set(['xxx', 'yyy']))
#####end