集合类型

集合(Set)

集合(set)是一个无序不重复元素的序列。

基本功能是进行成员关系测试和删除重复元素。

可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。

集合使用

parame = {value01,value02,...}
或者
set(value)

集合数据类型的核心在于自动去重。很多时候,这能给你省不少事。

>>> s = set([1,1,2,3,3,4])
>>> s
{1, 2, 3, 4}        # 自动去重
>>> set("it is a nice day")     # 对于字符串,集合会把它一个一个拆开,然后去重
{'s', 'e', 'y', 't', 'c', 'n', ' ', 'd', 'i', 'a'}

通过add(key)方法可以添加元素到set中,可以重复添加,但不会有效果:

>>> s = {1, 2, 3, 4}
>>> s
{1, 2, 3, 4}
>>> s.add(5)
>>> s
{1, 2, 3, 4, 5}
>>> s.add(5)
>>> s
{1, 2, 3, 4, 5}

可以通过update()方法,将另一个对象更新到已有的集合中,这一过程同样会进行去重。

>>> s
{1, 2, 3, 4, 5}
>>> s.update("hello")
>>> s
{1, 2, 3, 4, 5, 'e', 'o', 'l', 'h'}

通过remove(key)方法删除指定元素,或者使用pop()方法。注意,集合的pop方法无法设置参数,删除指定的元素:

>>> s
{1, 2, 3, 4, 5, 'e', 'o', 'l', 'h'}
>>> s.remove("l")
>>> s
{1, 2, 3, 4, 5, 'e', 'o', 'h'}
>>> s.pop()
1
>>> s
{2, 3, 4, 5, 'e', 'o', 'h'}
>>> s.pop(3)
Traceback (most recent call last):
  File "<pyshell#22>", line 1, in <module>
    s.pop(3)
TypeError: pop() takes no arguments (1 given)

除了add、clear、copy、pop、remove、update等集合常规操作,剩下的全是数学意义上的集合操作,交并差等等。

对集合进行交并差等,既可以使用union一类的英文方法名,也可以更方便的使用减号表示差集,“&”表示交集,“|”表示并集。看看下面的例子:

>>> basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
>>> print(basket)                      # 删除重复的
{'orange', 'banana', 'pear', 'apple'}
>>> 'orange' in basket                 # 检测成员
True
>>> 'crabgrass' in basket
False
>>> # 以下演示了两个集合的交、并、差操作
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a                                  # a 中唯一的字母
{'a', 'r', 'b', 'c', 'd'}
>>> a - b                              # 在 a 中的字母,但不在 b 中
{'r', 'd', 'b'}
>>> a | b                              # 在 a 或 b 中的字母
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
>>> a & b                              # 在 a 和 b 中都有的字母
{'a', 'c'}
>>> a ^ b                              # 在 a 或 b 中的字母,但不同时在 a 和 b 中
{'r', 'd', 'b', 'm', 'z', 'l'}

集合数据类型属于Python内置的数据类型,但不被重视,在很多书籍中甚至都看不到一点介绍。其实,集合是一种非常有用的数据结构,它的去重和集合运算是其它内置类型都不具备的功能,在很多场合有着非常重要的作用,比如网络爬虫。

我们都知道爬虫需要发散链接,一个页面连着另一个页面,不断爬取所有的超级链接,才能把整个站点爬取下来。然而在成千上万个页面链接中,有很大一部分可能是重复的链接或者循环互链,如果不对链接进行去重处理,那么爬虫要么陷入死循环内,要么就是出现错误。这个时候可以用集合的去重功能,保留一个曾经爬过页面的不重复的元素集合,每爬一个新链接,看看集合里是否曾经爬过,没有就开始爬,并将链接加入集合,爬过就忽略当前链接。在这里,用集合远比用列表或者字典要来得高效、节省得多。

集合方法

序号方法及描述
1 add(obj)
在集合中添加一个元素,如果元素已经存在,不会抛出异常
2 clear() 
删除集合中的所有元素(清空集合)
3 copy() 
复制(浅拷贝)集合
4 difference(s2)
返回两个或多个集合的差值作为一个新集合(差集),同 s1 - s2
5 difference_update(s2)
从该集合中删除其他集合的所有元素(把差集赋值给该集合)
6 discard()
与remove()功能相同,从集合中删除一个元素,如果元素不在集合中不会抛出异常
7 intersection(s2)
返回两个集合的交集作为一个新集合(交集),同 s1 & s2
8 intersection_update(s2)
更新该集合,从自己与另一个集合的交集(把交集赋值给该集合)
9 isdisjoint(s2)
判断两个集合是否不相交,不相交时返回True
10 issubset(s2)
判断该集合是否是其他集合的子集,如果是返回True 同 <=
11  issuperset(s2)
判断该集合是否包含其他集合,如果包含返回True 同 >=
12  pop()
删除并返回一个集合中的一个随机元素,当集合为空时会抛出异常
13  remove()
与discard()功能相同,从集合中删除一个元素,如果元素不在集合中会抛出异常
14  symmetric_difference(s2)
返回两个集合的对称差作为一个新的集合(对称差集),同 s1 ^ s2
15 symmetric_difference_update(s2)
更新该集合,从自己与另一个集合的对称差集(把对称差集赋值给该集合)
16 union(s2)
返回所有集合的并值作为一个新集合(并集),同 s1 | s2
17 update(iterable)
在集合中添加元素,通过一个可迭代对象
18 in/not in
判断某个元素是否在集合中
19 ==/!=
判断两个集合是否相等
posted @ 2018-12-29 15:50  小黑_9527  阅读(385)  评论(0编辑  收藏  举报