第十章 集合(集合定义与set函数、集合操作-交集-并集-差集等、适用集合方法、适用集合函数-max-min-sum-sorted等、不可变集合)
集合的基本概念是无序且每个元素是唯一的,集合元素的内容是不可变的(immutable),常见的元素有整数(intger)、浮点数(float)、字符串(string)、元组(tuple)等。至于可变(mutable)内容列表(list)、字典(dict)、集合(set)等不可以是集合元素。但是集合本身是可变的(mutable),我们可以增加或删除集合的元素。
一、集合定义。Python可以使用大括号“{ }”或set( )函数建立集合。使用大括号{}建立集合语法如下:name_set = {元素1, ..., 元素n}。集合的特色是元素是唯一的,所以如果定义集合时有重复元素情形,多的部分将被自动舍去。集合包含的元素不一定是同一种数据类型,有可能同时包含整数、字符串、元组等各种数据类型元素。
字典是用大括号定义,集合也是用大括号定义。使用空的大括号{ }定义,获得的是空字典,而不是空集合。定义空集合必须用set()函数:name_set = set()。
set( )函数也可以带参数,参数可以是字符串(string)、列表(list)、元组(tuple)等,这时原先字符串(string)、列表(list)、元组(tuple)的元素将被转成集合元素。如果再将集合通过list()或者tuple()函数转为列表或者元组,就可以删除原先列表或元组中的重复元素。
x = set('DeepLearning mean deep learning') #使用字符串建立集合
#集合元素具有唯一性,虽然原先字符串有很多字母重复,但经过set()处理后不再重复
print(x)
print(type(x))
#表达式1
fruits = ['apple', 'orange', 'apple', 'banana', 'orange']
x = set(fruits) #使用列表建立集合
print(x)
#表达式2
y = set(['apple', 'orange', 'apple', 'banana', 'orange']) #使用列表建立集合
print(y)
#使用元组建立集合
cities = set(('beijing', 'shanghai', 'beijing', 'guangzhou', 'shanghai'))
print(cities)
#集合转为元组,去除重复元素
tuple_cities = tuple(cities)
print(tuple_cities)
二、集合的操作有如下几种:
集合操作符号 | 说明 | A和B集合操作 | 示例 假设集合A = {1, 3, 4, 5}, 集合B = {2, 3, 5, 7, 9} |
---|---|---|---|
& | 交集,取两个集合共同元素,也可以使用intersection( )方法完成 | A & B A.intersection(B) B.intersection(A) | C = A & B print(C) C = B.intersection(A) print(C) |
| | 并集,取两个集合所有元素,也可以使用union( )方法完成 | A | B A.union(B) B.union(A) | D = A | B print(D) D = B.union(A) print(D) |
- | 差集,获得属于A集合,同时不属于B集合的元素,也可以使用difference( )方法完成。A-B和B-A含义不同,结果也不同 | A - B A.difference(B) | E = A - B F = B - A print(E, F) E = A.difference(B) F = B.difference(A) print(E, F) |
^ | 对称差集,获得属于A或B集合,但是排除同时属于A和B的元素,也可以使用symmetric_difference( )方法完成 | A ^ B A.symmetric_difference(B) B.symmetric_difference(A) | G = A ^ B print(G) G = B.symmetric_difference(A) print(G) |
== | 等于,判断两个集合是否相等 | A == B | print(A == B) |
!= | 不等于,判断两个集合是否不相等 | A != B | print(A != B) |
in | 是成员,测试元素是否是集合的元素成员 | x in A y in B | is_in = 4 in A print(is_in) is_in = 4 in B print(is_in) |
not in | 不是成员,测试元素是否不是集合的元素成员 | x not in A y not in B | print(2 not in A) print(2 not in B) |
三、适用集合的方法:
集合方法 | 语法格式及说明 | 示例 |
---|---|---|
add() | A.add(新增元素)
增加一个元素到集合,返回值为None | cities = {'beijing', 'guangzhou'} #增加一般元素 cities.add('shanghai') print(cities) #增加已有元素 cities.add('beijing') print(cities) #增加元组元素 tup = (1, 2, 3) cities.add(tup) print(cities) |
copy() | B = A.copy()
深拷贝复制集合,经过复制后一个集合内容改变时,不会影响到另一个集合的内容 | A = {1, 2, 3} B = A.copy() print(A, B) A.add(4) print(A, B) |
remove() | A.remove(待删除元素)
如果指定删除的元素存在集合内,remove( )可以删除这个集合元素,返回值为None;如果指定删除的元素不存在集合内,将有KeyError产生 | countries = {'japan', 'china', 'france'} print(countries) countries.remove('japan') print(countries) |
discard() | A.discard(待删除元素)
可以删除集合的元素,如果元素不存在也不会有错误产生,不论删除结果为何,这个方法会传回None | animals = {'dog', 'cat', 'bird', 'tiger'} |
pop() | ret_element = A.pop()
用随机方式删除集合元素,所删除的元素将被传回,如果集合是空集合则程序会产生TypeError错误 | animals = {'dog', 'cat', 'bird', 'tiger'} print(animals) ret_element = animals.pop() print(ret_element) print(animals) |
clear() | A.clear()
删除集合中所有元素,返回值是None | animals = {'dog', 'cat', 'bird', 'tiger'} animals.clear() print(animals) |
isdisjoint() | ret_boolean = A.isdisjoint(B)
如果2个集合没有共同的元素会传回True,否则传回False | A = {'a', 'b', 'c'} B = {'c', 'd', 'e'} C = {'h', 'k', 'p'} boolean = A.isdisjoint(B) print(boolean) print(A.isdisjoint(C)) |
issubset() | ret_boolean = A.issubset(B)
判断一个集合是否是另一个集合的子集合,如果是返回True,否则返回False | A = {'a', 'b', 'c'} B = {'a', 'b', 'c', 'd', 'e'} print(A.issubset(B)) print(B.issubset(A)) |
issuperset() | ret_boolean = A.issuperset(B)
判断一个集合是否是另一个集合的父集合,如果是返回True,否则返回False | A = {'a', 'b', 'c'} B = {'a', 'b', 'c', 'd', 'e'} print(A.issuperset(B)) print(B.issuperset(A)) |
intersection_update() | A.intersection_update(*B)
使用交集更新集合内容,返回值为None。*B代表可以有1到多个集合,如果只有一个集合,例如是B,则执行后A将是A与B的交集。如果*B代表(B, C),则执行后A将是A、B与C的交集 | A = {'a', 'b', 'c', 'd'} B = {'c', 'a', 'k'} C = {'c', 'f', 'w'} ret_value = A.intersection_update(B) print(ret_value) print(A, B) A.intersection_update(B, C) print(A, B, C) |
update() | A.update(B)
使用并集更新集合内容,返回值为None。上面是将集合B的元素加到集合A内 | A = {'a', 'b', 'c', 'd'} B = {'c', 'a', 'k'} A.update(B) print(A, B) |
difference_update() | A.difference_update(B)
删除集合内与另一集合重复的元素,返回值为None | A = {'a', 'b', 'c', 'd'} B = {'c', 'a', 'k'} A.difference_update(B) print(A, B) |
symmetric_difference_update() | A.symmetric_difference_update(B)
使用对称差集更新集合内容,返回值为None | A = {'a', 'b', 'c', 'd'} B = {'c', 'a', 'k'} A.symmetric_difference_update(B) print(A, B) |
四、适用集合的基本函数操作:
1、max(name_set)、min(name_set)、sum(name_set):如果元素内容是数值,可以使用max( )列出最大值、min( )列出最小值和sum( )列出总和。如果元素内容是字符或字符串,可以使用max( )列出unicode码的最大值、min( )列出unicode码的最小值,sum( )则不可用在字符或字符串元素。
2、len(name_set):可以列出集合元素的数量。
3、sorted(name_set):对集合元素进行排序,如果执行sorted(name_set, reverse = True)则是进行反向排序。
4、enumerate(name_set):传回连续整数配对的enumerate对象,之前在列表和元组中均有说明。
drinks = {'coffee', 'tea', 'wine'}
for drink in drinks:
print(drink)
enum_drinks = enumerate(drinks)
print(enum_drinks) #打印enumerate对象所在内存地址
print(type(enum_drinks)) #打印对象类型
print(list(enum_drinks)) #转成列表打印输出
for item in enumerate(drinks): #循环输出
print(item)
for count, item in enumerate(drinks): #将coun和元素内容分开输出
print(count, item)
for count, item in enumerate(drinks, 10): #将起始值设置为10
print(count, item)
五、冻结集合:set是可变集合,frozenset是不可变集合也可直译为冻结集合,这是一个新的类别(class),只要设定元素后,这个冻结集合就不能再更改了。如果将元组(tuple)想成不可变列表(immutablelist),冻结集合就是不可变集合(immutable set)。冻结集合的不可变特性优点是可以用它作字典的键(key),也可以作为其他集合的元素。冻结集合的建立方式是使用frozenset()函数,冻结集合建立完成后,不可使用add( )或remove( )更改冻结集合的内容。但是可以执行intersection( )、union( )、difference( )、symmetric_difference( )、copy( )、issubset()、issuperset( )、isdisjoint( )等方法。
X = frozenset([1, 3, 4])
Y = frozenset((4, 7, 9))
print(X, Y)
for x in X:
print(x)
for y in Y:
print(y)