13 Set集

集Set的形式和字典很像,是无序集合,也是各个数据项用逗号间隔用花括号括起来,区别数据项不是一对儿,就是一个数据,且数据项的值不重复唯一。本章的这个Python数据类型真的和数学里的集非常相似,它既有基础的创建集合set集合set添加集合删除又有交集并集差集等操作。

13.1 创建集

创建一个集可以依据定义通过赋值来实现,也可用set函数来创建集。

s1 = {1, 5, "a", "hello"}
s2 = set("hello world")
s3 = set([1, 2, 1, 4, 3, 2])
print s1
print s2
print s3

程序执行结果:

set(['a', 1, 'hello', 5])
set([' ', 'e', 'd', 'h', 'l', 'o', 'r', 'w'])
set([1, 2, 3, 4])

这样的结果差强人意,不显著!但可以看出集里的各项数据是不重复的,例如在s2集里的l字母只有一个。所以有时有些程序用set来对某些集合类型实现去重。

13.2 集的增删

集是可以修改的,增加元素可以用add和update函数。删除可以用pop、discard、remove等函数。

(1) 增加集里的元素

add函数的参数视为一个整体插入到集里,而update函数传入的参数是把要传入的元素拆分,做为个体传入到集合中。

s = set("hello")
print s
s.add("a")
print s
s.add("e")
print s
s.add("python")
print s
s.update([1, 3, 4, "e"])
print s

程序执行结果:

set(['h', 'e', 'l', 'o'])
set(['a', 'h', 'e', 'l', 'o'])
set(['a', 'h', 'e', 'l', 'o'])
set(['a', 'e', 'python', 'h', 'l', 'o'])
set(['a', 1, 3, 'e', 'python', 'h', 'l', 'o', 4])

(2) 删除集里的元素

删除集合里的元素可以用pop函数,pop函数和列表的pop机制一样,随机删除一个返回值就是被删除的那个元素值,但如果集是空集用pop会报错异常。

s = set("hello")
print s
print "pop ->", s.pop()
print s
s = set()
print s
print s.pop()

程序执行结果如下:

set(['h', 'e', 'l', 'o'])
pop -> h
set(['e', 'l', 'o'])
set([])
Traceback (most recent call last):
  File "test2.py", line 25, in <module>
    print s.pop()
KeyError: 'pop from an empty set'

异常的原因是集此时是空的。

discard函数可以删除集里某值,如果discard的参数值不属于集无任何操作。

s = set("hello")
print s
s.discard("o")
print s
s.discard("a")
print s

程序执行结果:

set(['h', 'e', 'l', 'o'])
set(['h', 'e', 'l'])
set(['h', 'e', 'l'])

remove函数和discard基本一样,区别在于函数的参数值不属于集时程序报错异常。

s = set("hello")
print s
s.remove("o")
print s
s.remove("a")
print s

程序执行结果:

set(['h', 'e', 'l', 'o'])
set(['h', 'e', 'l'])
Traceback (most recent call last):
  File "test2.py", line 37, in <module>
    s.remove("a")
KeyError: 'a'

13.3 集的交集、并集、差集

交集:$A \cap B = ${$x | x \in A$ 且 $ x \in B$}。可以用&运算或者intersection函数

并集:$A \cup B = ${$ x | x \in A$ 或 $x \in B $}。可以用|运算符或者union函数。

差集: $A - B = ${$x \mid x \in A$ 且 $x \notin B $}。可用-运算符或者difference函数。

对称差集:$A \bigtriangleup B$ = {$x \mid x \in A \cup B$且 $x \notin A \cap B$}。求对称差集可用^运算符或者用 symmetric_difference或symmetric_difference_update函数。

s = {1, 2, 3}
t = {2, 4}
u = s | t
print u
i = s & t
print i
d = s - t
print d
d = s ^ t
print d

程序的执行结果如下:

set([1, 2, 3, 4])# 并集
set([2])# 交集
set([1, 3])# 差集
set([1, 3, 4])#对称差集

将运算符换作等价的函数,程序如下所示:

s = {1, 2, 3}
t = {2, 4}
u = s.union(t)#求并集
print u
i = s.intersection(t)#求交集
print i
d = s.difference(t)#求s和t的差集
print d
d = s.symmetric_difference(t)#求对称差集
print d

程序的执行结果是一样的。

13.4 集的遍历

尽管集是非有序的集合类型,但也是可以借助for来遍历集的各个数据项,这种方式有个学术名词叫迭代。

print "*****************"
s = set("hello the cruel world!")
print s
print "*****************"
for x in s:
    print x
print "*****************"

程序执行结果如下所示:

*****************
set(['!', ' ', 'c', 'e', 'd', 'h', 'l', 'o', 'r', 'u', 't', 'w'])
*****************
!

c
e
d
h
l
o
r
u
t
w
*****************