说明:

·类似于数学中学的集合,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')>>> aset(['y', 'b', 'o'])>>> a.add('xpleaf')>>> aset(['y', 'b', 'xpleaf', 'o'])

·add()的参数不能为列表和字典,但是可以为元组:

>>> b = set('Hello')>>> bset(['H', 'e', 'l', 'o'])>>> b.add(('xpleaf','CL'))>>> bset(['H', ('xpleaf', 'CL'), 'e', 'l', 'o'])

--update()

·功能:把要添加的元素拆分(如果不是单个字符),再一个一个地添加到集合中;

·演示如下:

>>> aset(['y', 'b', 'xpleaf', 'o'])>>> a.update('Python')>>> aset(['b', 'h', 'xpleaf', 'n', 'P', 'o', 'y', 't'])>>> a.update([1,2,3])>>> aset([1, 2, 'b', 'h', 'xpleaf', 'n', 'P', 3, 'o', 'y', 't'])

·前面讲集合是不支持indexing的,所以这里看到新添加的元素在集合中是无序排列的;


3.集合删除:remove(),discard()与pop()

--remove()

·功能:从set中删除元素,如果不存在则引发KeyError;

·演示如下:

>>> aset([1, 2, 'b', 'h', 'xpleaf', 'n', 'P', 3, 'o', 'y', 't'])>>> a.remove('b')>>> aset([1, 2, 'h', 'xpleaf', 'n', 'P', 3, 'o', 'y', 't'])>>> a.remove('KeyError')Traceback (most recent call last):  File "
", line 1, in 
KeyError: 'KeyError'

--discard()

·功能:如果在set中存在该元素,则删除,无论存在与否,都没有提示;

·演示如下:

>>> aset([1, 2, 3, 'h', 'xpleaf', 'n', 'P', 'o', 'y', 't'])>>> import tab>>> a.discard('xpleaf')>>> aset([1, 2, 3, 'h', 'n', 'P', 'o', 'y', 't'])>>> a.discard('CL')>>> aset([1, 2, 3, 'h', 'n', 'P', 'o', 'y', 't'])

--pop()

·功能:删除并返回set中一个不确定的元素;

·演示如下:

>>> a.pop()1>>> aset([2, 3, 'h', 'n', 'P', 'o', 'y', 't'])>>> a.pop()2>>> a.pop()3>>> aset(['h', 'n', 'P', 'o', 'y', 't'])


4.集合数学操作

·进行数学操作需要了解一些集合操作符号和数学符号:

数学符号 Python符号
含义
-或\ - 差集,相对补集
&
交集
|
并集
取∩的补 ^ 对称差集
!=

不等于

= == 等于
in
属于
not in
不属于

--差集,相对补集:-

>>> a = set(range(10))>>> b = set(range(15))>>> aset([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])>>> bset([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])>>> b - aset([10, 11, 12, 13, 14])>>> a - bset([])

--交集:&

>>> a & bset([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 | bset([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])>>> bset([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])>>> a ^ bset([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 == bFalse>>> a != bTrue

--属于与不属于:in与not in

>>> aset([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])>>> bset([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])>>> a in bFalse>>> b in aFalse>>> a not in bTrue>>> 0 in aTrue

·指的是元素是否属于集合,而不是集合之间的包含;

·集合之间的包含(子集)可用:>、>=、<、<=等表示

>>> a >= bFalse>>> a <= bTrue

·<=相当于函数issubset():

>>> a <= bTrue>>> a.issubset(b)    ===>a是b的子集True

·>=相当于函数issuperset():

>>> a >= bFalse>>> a.issuperset(b)    ===>a不是b的超集,即a不包含bFalse>>> b.issuperset(a)    ===>b是a的超集,即b包含aTrue


5.其它操作

--len()

·功能:测定集合的长度;

·演示如下:

>>> len(a)10>>> len(b)15

--copy()

·功能:浅复制;

·前面已有提及,不再重复;

--hash()

·功能:返回参数的哈希值;

·演示如下:

>>> aset([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])>>> bset([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])>>> hash(a)Traceback (most recent call last):  File "
", line 1, in 
TypeError: unhashable type: 'set'

·可以看到普通hash()函数的参数不能为set类型(列表也不行),但可以为字符串类型:

>>> hash('CL')8576051523077447

·只要数据量足够大,hash是有可能产生相同的hash值,更安全的为md5类型的hash值计算:

>>> import hashlib>>> a = 'hello'>>> a = hashlib.md5()>>> a.hexdigest()'d41d8cd98f00b204e9800998ecf8427e'

·可以看到产生的hash值中还包含有字母等字符,因此破解的难度会更大。