概念和基础
集合(set),由一个或多个确定的元素所构成的整体,是一个无序不重复元素的序列,可以使用大括号{}或者set()函数创建集合,注意:创建空集合只能使用set(),如果使用{}创建的是一个空字典,集合存在的意义就在于去重和关系运算。
创建格式:
param = {value1, value2, ...}
or
param = set(value)
快速判断元素是否在集合内使用可以使用in,如果存在的话返回True,否则返回False
e.g.
value in param
去重演示:
>>>set_test = set('hello')
>>>set_test
{'h', 'e', 'l', 'o'}
集合中的元素有三个特征:
- 确定性(必须可哈希)
- 互异性(去重)
- 无序性(集合中的元素没有先后之分,集合{2,3,4}和集合{3,4,2}算是同一个集合)
注意:集合存在的意义就在于去重和关系运算
set在创建的时候有可变集合和不可变集合两种,可变集合set(value)或者直接{value1, value2, …},不可变集合可以通过将可变集合改为不可变集合,
e.g.
frozenset(set_name)
关系运算
差集
差集有差集和对称差集之分,差集是只在某一个集合中有,在另外一个集合中没有,对称差集是两个集合各自有的元素做并集并返回。
差集
可以使用集合的difference()方法或者使用符号"-"。
e.g.
>>>names1 = {'Jack', 'Alex'}
>>>names2 = {'Jack', 'Mark'}
>>>print(names1.difference(names2)) #只在集合names1中存在的元素
{'Alex'}
>>>print(names1 - names2) #只在集合names1中存在的元素
{'Alex'}
对称差集
按照对对称差集的理解,可以通过对 set1 集合求对 set2 集合的差集,再并上 set2 集合对 set1 集合的差集,如下所示:
>>>names1 = {'Jack', 'Alex'}
>>>names2 = {'Jack', 'Mark'}
>>>names1_names2 = names1.difference(names2) #求对于names1对names2的差集
>>>print(names2_names2)
{'Alex'}
>>>names2_names1 = names2.difference(names1) #求对于names2对names1的差集
>>>print(names2_names1)
{'Mark'}
>>>names1_names2 | names2_names1
{'Alex', 'Mark'}
这种方法比较繁琐,需要对两个集合一次求另一个集合的差集,然后再求并集,python中直接提供了方法来实现对称差集,可以使用集合的symmetric_difference()或者使用符号"^"。
>>>names1 = {'Jack', 'Alex'}
>>>names2 = {'Jack', 'Mark'}
>>>print(names1.symmetric_difference(names2)) #只在集合names1中存在的元素
{'Alex', 'Mark'}
>>>print(names1 ^ names2) #只在集合names1中存在的元素
{'Alex', 'Mark'}
交集
获取两个集合中重复的部分并返回,可以使用集合的intersection()方法,或者使用符号"&"。
e.g.
>>>names1 = {'Jack', 'Alex'}
>>>names2 = {'Jack', 'Mark'}
>>>print(names1.intersection(names2))
{'Jack'}
>>>print(names1 & names2)
{'Jack'}
并集
获取两个集合中所有的元素并去重,可以使用集合的union()方法,或者使用符号"|"。
e.g.
>>>names1 = {'Jack', 'Alex'}
>>>names2 = {'Jack', 'Mark'}
>>>print(names1.union(names2))
{'Mark', 'Alex', 'Jack'}
>>>print(names1 | names2)
{'Mark', 'Alex', 'Jack'}
常用操作
元素的增加
python 中元素的增加有两种类型,一种的单个元素的添加,一种是对序列的添加。
单个元素的添加
python 中单个元素的添加使用的是add()方法,add()的作用类似于列表中的append()方法。注意:使用该方法的时候不能添加可变数据类型,比如列表,错误提示:TypeError: unhashable type: ‘list’。
>>>set1 = {1, 2}
>>>set1.add(3)
{1, 2, 3}
>>>set1.add((4, 5))
{(4, 5), 1, 2, 3}
序列的添加
python中对序列的添加使用的是update()方法,update()方法的作用类似于列表中的extend()方法,序列包括但不限于列表、元组和字典,update方法支持同时传入多个参数。
>>> set1 = {1,2}
>>> set1.update([3,4],[1,2,7])
>>> set1
{1, 2, 3, 4, 7}
>>> set1.update("hello") #在update字符串的时候比较特殊,是将每个字符拆开添加到集合中
>>> set1
{1, 2, 3, 4, 7, 'h', 'e', 'l', 'o'}
>>> set1.update(("hello", "world"))
{1, 2, 3, 4, 7, 'l', 'h', 'world', 'o', 'e', 'hello'}
元素的删除
集合中删除单个元素有三种方法,discard(),remove()和pop(),三者的区别:
set.discard(value)
可以指定元素,并且无返回值,在元素不在集合里的时候不会抛出异常set.remove(value)
可以指定元素,,并且无返回值,如果元素不在集合里,会抛出KeyError
错误set.和pop()
随机删除一个元素,不能指定,返回删除的元素,并且当集合为空的时候,会抛出KeyError
错误
清空集合的方法:clear(),就算是一个空集合,清空的话也不会报错
>>> set1={1,2,3,4}
>>> set1.discard(1)
>>> set1
{2, 3, 4}
>>> set1.discard(1) #元素不存在,解释器也没有报错
>>> set1
{2, 3, 4}
>>> set1.remove(1)
Traceback (most recent call last):
File "<pyshell#31>", line 1, in <module>
set1.remove(1)
KeyError: 1
>>> set1.clear()
>>> set1
set()
>>> set1.pop()
Traceback (most recent call last):
File "<pyshell#34>", line 1, in <module>
set1.pop()
KeyError: 'pop from an empty set'
>>> set1.clear()