说明:
·类似于数学中学的集合,Python中的集合可以实现去重的功能,通过set()函数来实现:
·sets支持x in set, len(set)和 for x in set;
·作为一个无序的集合,sets 不记录元素位置或者插入点,因此,sets不支持indexing, slicing,或其它类序列(sequence-like)的操作;
·学习集合,主要是学习集合的一系列标准操作:集合创建、集合添加、集合删除、交并差集等;
1.创建集合:set()
>>> a = range(10) >>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> a.insert(3,8) >>> a.insert(3,6) >>> a [0, 1, 2, 6, 8, 3, 4, 5, 6, 7, 8, 9] >>> set(a) set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> set(‘boy‘) set([‘y‘, ‘b‘, ‘o‘])
2.集合添加:add()与update
--add()
·功能:把要添加的元素作为一个整体添加到集合中;
·演示如下:
>>> a = set(‘boy‘) >>> a set([‘y‘, ‘b‘, ‘o‘]) >>> a.add(‘xpleaf‘) >>> a set([‘y‘, ‘b‘, ‘xpleaf‘, ‘o‘])
·add()的参数不能为列表和字典,但是可以为元组:
>>> b = set(‘Hello‘) >>> b set([‘H‘, ‘e‘, ‘l‘, ‘o‘]) >>> b.add((‘xpleaf‘,‘CL‘)) >>> b set([‘H‘, (‘xpleaf‘, ‘CL‘), ‘e‘, ‘l‘, ‘o‘])
--update()
·功能:把要添加的元素拆分(如果不是单个字符),再一个一个地添加到集合中;
·演示如下:
>>> a set([‘y‘, ‘b‘, ‘xpleaf‘, ‘o‘]) >>> a.update(‘Python‘) >>> a set([‘b‘, ‘h‘, ‘xpleaf‘, ‘n‘, ‘P‘, ‘o‘, ‘y‘, ‘t‘]) >>> a.update([1,2,3]) >>> a set([1, 2, ‘b‘, ‘h‘, ‘xpleaf‘, ‘n‘, ‘P‘, 3, ‘o‘, ‘y‘, ‘t‘])
·前面讲集合是不支持indexing的,所以这里看到新添加的元素在集合中是无序排列的;
3.集合删除:remove(),discard()与pop()
--remove()
·功能:从set中删除元素,如果不存在则引发KeyError;
·演示如下:
>>> a set([1, 2, ‘b‘, ‘h‘, ‘xpleaf‘, ‘n‘, ‘P‘, 3, ‘o‘, ‘y‘, ‘t‘]) >>> a.remove(‘b‘) >>> a set([1, 2, ‘h‘, ‘xpleaf‘, ‘n‘, ‘P‘, 3, ‘o‘, ‘y‘, ‘t‘]) >>> a.remove(‘KeyError‘) Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: ‘KeyError‘
--discard()
·功能:如果在set中存在该元素,则删除,无论存在与否,都没有提示;
·演示如下:
>>> a set([1, 2, 3, ‘h‘, ‘xpleaf‘, ‘n‘, ‘P‘, ‘o‘, ‘y‘, ‘t‘]) >>> import tab >>> a.discard(‘xpleaf‘) >>> a set([1, 2, 3, ‘h‘, ‘n‘, ‘P‘, ‘o‘, ‘y‘, ‘t‘]) >>> a.discard(‘CL‘) >>> a set([1, 2, 3, ‘h‘, ‘n‘, ‘P‘, ‘o‘, ‘y‘, ‘t‘])
--pop()
·功能:删除并返回set中一个不确定的元素;
·演示如下:
>>> a.pop() 1 >>> a set([2, 3, ‘h‘, ‘n‘, ‘P‘, ‘o‘, ‘y‘, ‘t‘]) >>> a.pop() 2 >>> a.pop() 3 >>> a set([‘h‘, ‘n‘, ‘P‘, ‘o‘, ‘y‘, ‘t‘])
4.集合数学操作
·进行数学操作需要了解一些集合操作符号和数学符号:
数学符号 | Python符号 | 含义 |
-或\ | - | 差集,相对补集 |
∩ | & | 交集 |
∪ | | | 并集 |
取∩的补 | ^ | 对称差集 |
≠ | != | 不等于 |
= | == | 等于 |
∈ | in | 属于 |
not in | 不属于 |
--差集,相对补集:-
>>> a = set(range(10)) >>> b = set(range(15)) >>> a set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> b set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]) >>> b - a set([10, 11, 12, 13, 14]) >>> a - b set([])
--交集:&
>>> a & b set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
·也可以用intersection()函数实现:
>>> a.intersection(b) set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
--并集:|
>>> a | b set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
·也可以用union()函数实现:
>>> a.union(b) set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
--对称差集:^
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> b set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]) >>> a ^ b set([10, 11, 12, 13, 14])
·也可以用symmetric_difference()函数实现:
>>> a.symmetric_difference(b) set([10, 11, 12, 13, 14]) >>> b.symmetric_difference(a) set([10, 11, 12, 13, 14])
--等于与不等于:==与!=
>>> a == b False >>> a != b True
--属于与不属于:in与not in
>>> a set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> b set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]) >>> a in b False >>> b in a False >>> a not in b True >>> 0 in a True
·指的是元素是否属于集合,而不是集合之间的包含;
·集合之间的包含(子集)可用:>、>=、<、<=等表示
>>> a >= b False >>> a <= b True
·<=相当于函数issubset():
>>> a <= b True >>> a.issubset(b) ===>a是b的子集 True
·>=相当于函数issuperset():
>>> a >= b False >>> a.issuperset(b) ===>a不是b的超集,即a不包含b False >>> b.issuperset(a) ===>b是a的超集,即b包含a True
5.其它操作
--len()
·功能:测定集合的长度;
·演示如下:
>>> len(a) 10 >>> len(b) 15
--copy()
·功能:浅复制;
·前面已有提及,不再重复;
--hash()
·功能:返回参数的哈希值;
·演示如下:
>>> a set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> b set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]) >>> hash(a) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: ‘set‘
·可以看到普通hash()函数的参数不能为set类型(列表也不行),但可以为字符串类型:
>>> hash(‘CL‘) 8576051523077447
·只要数据量足够大,hash是有可能产生相同的hash值,更安全的为md5类型的hash值计算:
>>> import hashlib >>> a = ‘hello‘ >>> a = hashlib.md5() >>> a.hexdigest() ‘d41d8cd98f00b204e9800998ecf8427e‘
·可以看到产生的hash值中还包含有字母等字符,因此破解的难度会更大。
本文出自 “香飘叶子” 博客,请务必保留此出处http://xpleaf.blog.51cto.com/9315560/1695685
原文地址:http://xpleaf.blog.51cto.com/9315560/1695685