python-集合(第二篇(七):集合)

第二篇(七):集合

 

python 集合 集合标准操作

摘要: 说明: ·类似于数学中学的集合,Python中的集合可以实现去重的功能,通过set()函数来实现: ·sets支持x in set, len(set)和 for x in set; ·作为一个无序的集合,sets 不记录元素位置或者插入点,因此,sets不支持indexing, slicing,或...

说明:

·类似于数学中学的集合,Python中的集合可以实现去重的功能,通过set()函数来实现:

·sets支持x in set, len(set)和 for x in set;

·作为一个无序的集合,sets 不记录元素位置或者插入点,因此,sets不支持indexing, slicing,或其它类序列(sequence-like)的操作;

·学习集合,主要是学习集合的一系列标准操作:集合创建、集合添加、集合删除、交并差集等;

 

 


 

1.创建集合:set()

 

1
2
3
4
5
6
7
8
9
10
11
>>> a = range(10)
>>> a
[0123456789]
>>> a.insert(3,8)
>>> a.insert(3,6)
>>> a
[012683456789]
>>> set(a)
set([0123456789])
>>> set('boy')
set(['y''b''o'])

 


 

2.集合添加:add()与update

 

--add()

·功能:把要添加的元素作为一个整体添加到集合中;

·演示如下:

1
2
3
4
5
6
>>> a = set('boy')
>>> a
set(['y''b''o'])
>>> a.add('xpleaf')
>>> a
set(['y''b''xpleaf''o'])

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

1
2
3
4
5
6
>>> b = set('Hello')
>>> b
set(['H''e''l''o'])
>>> b.add(('xpleaf','CL'))
>>> b
set(['H', ('xpleaf''CL'), 'e''l''o'])

 

--update()

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

·演示如下:

1
2
3
4
5
6
7
8
>>> 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([12'b''h''xpleaf''n''P'3'o''y''t'])

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

 

 


 

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

 

--remove()

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

·演示如下:

1
2
3
4
5
6
7
8
9
>>> a
set([12'b''h''xpleaf''n''P'3'o''y''t'])
>>> a.remove('b')
>>> a
set([12'h''xpleaf''n''P'3'o''y''t'])
>>> a.remove('KeyError')
Traceback (most recent call last):
  File "<stdin>", line 1in <module>
KeyError: 'KeyError'

 

--discard()

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

·演示如下:

1
2
3
4
5
6
7
8
9
>>> a
set([123'h''xpleaf''n''P''o''y''t'])
>>> import tab
>>> a.discard('xpleaf')
>>> a
set([123'h''n''P''o''y''t'])
>>> a.discard('CL')
>>> a
set([123'h''n''P''o''y''t'])

 

--pop()

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

·演示如下:

1
2
3
4
5
6
7
8
9
10
>>> a.pop()
1
>>> a
set([23'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 不属于

 

--差集,相对补集:-

1
2
3
4
5
6
7
8
9
10
>>> a = set(range(10))
>>> b = set(range(15))
>>> a
set([0123456789])
>>> b
set([01234567891011121314])
>>> b - a
set([1011121314])
>>> a - b
set([])

 

--交集:&

1
2
>>> a & b
set([0123456789])

·也可以用intersection()函数实现:

1
2
>>> a.intersection(b)
set([0123456789])

 

--并集:|

1
2
>>> a | b
set([01234567891011121314])

·也可以用union()函数实现:

1
2
>>> a.union(b)
set([01234567891011121314])

 

--对称差集:^

 

1
2
3
4
5
set([0123456789])
>>> b
set([01234567891011121314])
>>> a ^ b
set([1011121314])

·也可以用symmetric_difference()函数实现:

 

1
2
3
4
>>> a.symmetric_difference(b)
set([1011121314])
>>> b.symmetric_difference(a)
set([1011121314])

 

--等于与不等于:==与!=

1
2
3
4
>>> a == b
False
>>> a != b
True

 

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

1
2
3
4
5
6
7
8
9
10
11
12
>>> a
set([0123456789])
>>> b
set([01234567891011121314])
>>> a in b
False
>>> b in a
False
>>> a not in b
True
>>> 0 in a
True

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

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

1
2
3
4
>>> a >= b
False
>>> a <= b
True

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

1
2
3
4
>>> a <= b
True
>>> a.issubset(b)    ===>a是b的子集
True

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

1
2
3
4
5
6
>>> a >= b
False
>>> a.issuperset(b)    ===>a不是b的超集,即a不包含b
False
>>> b.issuperset(a)    ===>b是a的超集,即b包含a
True

 

 


 

5.其它操作

 

--len()

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

·演示如下:

1
2
3
4
>>> len(a)
10
>>> len(b)
15

 

--copy()

·功能:浅复制;

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

 

--hash()

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

·演示如下:

1
2
3
4
5
6
7
8
>>> a
set([0123456789])
>>> b
set([01234567891011121314])
>>> hash(a)
Traceback (most recent call last):
  File "<stdin>", line 1in <module>
TypeError: unhashable type: 'set'

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

1
2
>>> hash('CL')
8576051523077447

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

1
2
3
4
5
>>> import hashlib
>>> a = 'hello'
>>> a = hashlib.md5()
>>> a.hexdigest()
'd41d8cd98f00b204e9800998ecf8427e'

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

posted @ 2016-11-08 14:50  redis3389  阅读(163)  评论(0编辑  收藏  举报