说明:
·类似于数学中学的集合,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
[
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()
·功能:把要添加的元素作为一个整体添加到集合中;
·演示如下:
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
([
1
,
2
,
'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
([
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中存在该元素,则删除,无论存在与否,都没有提示;
·演示如下:
1
2
3
4
5
6
7
8
9
|
>>> 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中一个不确定的元素;
·演示如下:
1
2
3
4
5
6
7
8
9
10
|
>>> 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 |
不属于 |
--差集,相对补集:-
1
2
3
4
5
6
7
8
9
10
|
>>> 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
([])
|
--交集:&
1
2
|
>>> a & b
set
([
0
,
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
])
|
·也可以用intersection()函数实现:
1
2
|
>>> a.intersection(b)
set
([
0
,
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
])
|
--并集:|
1
2
|
>>> a | b
set
([
0
,
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
10
,
11
,
12
,
13
,
14
])
|
·也可以用union()函数实现:
1
2
|
>>> a.union(b)
set
([
0
,
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
10
,
11
,
12
,
13
,
14
])
|
--对称差集:^
1
2
3
4
5
|
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()函数实现:
1
2
3
4
|
>>> a.symmetric_difference(b)
set
([
10
,
11
,
12
,
13
,
14
])
>>> b.symmetric_difference(a)
set
([
10
,
11
,
12
,
13
,
14
])
|
--等于与不等于:==与!=
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
([
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
|
·指的是元素是否属于集合,而不是集合之间的包含;
·集合之间的包含(子集)可用:>、>=、<、<=等表示
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
([
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类型(列表也不行),但可以为字符串类型:
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值中还包含有字母等字符,因此破解的难度会更大。