Python set(集合) 这一定是最全的介绍集合的博文
Python的set是一个无序且无重复元素的集合,概念上相当于数学上的无序集,数据结构上相当于dict的键。
既然set是集合,则必然可以实现并、交、差、对称差等集合运算。
set是一组无序排列的可哈希的值,因此可以用作字典中的键。set和之前介绍的list、tuple、dict等一样,可以使用in操作符检查元素是否在集合中存在,使用len()求得集合元素的个数,使用for循环迭代其成员,使用copy()返回一个浅复制。不同之处在于集合本身无序,所以没有索引,就不能实现索引和切片操作。
set具有以下特性:
- 元素不重复出现
- 元素必须是不可变对象
你可以把set当作是dict中的键来理解,当然仅仅限于数据结构层面。
Python set基本操作
创建
#调用set方法创建
s = set() #创建空set
a = set('apple') #以字符串创建set
b = set(['p', 'p', 'a', 'l', 'e']) #以list创建set
c = set({'key1':'value1', 'key2':'value2', 'key3': 'value3'}) #以dict创建set
#使用"="创建
d = {'key1', 'key2', 'key3'}
e = {('key1', 'key2', 'key3')} #使用tuple创建
print(a,type(a))
print(b,type(b))
print(c,type(c))
print(d,type(d))
print(e,type(e))
执行结果为:
·无序无重复元素
集合数学运算并、交、差、对称差操作符
a = t | s # t 和 s的并集
b = t & s # t 和 s的交集
c = t – s # 求差集(求在t中,但不在s中的元素)
d = t ^ s # 对称差集(求在t或s中,但不会同时出现在二者中的元素)
基本操作
集合本身的增、删
>>>s = set([1, 2, 3, 4])
>>>s
{1, 2, 3, 4}
>>> s.add(5) #增加元素
>>> s
{1, 2, 3, 4, 5}
>>> s.remove(5) #删除元素5
>>> s.discard(4) #删除元素4
>>> s.pop() #移除某个元素(在有序数据集pop方法移除末尾元素,无序数据集则不确定)
>>> 1
{2, 3}
>>> s.update([1, 4, 5]) #添加多个元素
>>> s
{1, 2, 3, 4, 5}
>>> s.clear() #清空所有元素
>>> s
set() #即空集
集合数学运算之并(union)、交(intrersection) 、差(difference)方法
a = {11, 22, 33}
b = {22, 33, 44}
#并集
t = a.union(b) #取并集
print(t) #{33, 22, 11, 44}
#交集
t1 = a.intersection(b) #取交集
t2 = a.intersection_update #取交集并用交集更新a本身
#差集
box1 = a.difference(b)
#相当于数学上的集合a - b 即取差集
print(box1) #{11}
print(a) #{33, 11, 22}
box2 = a.difference_update(b)
#取差集 并用这些元素覆盖a本身
print(box2) #None
print(a) #{11}
集合数学运算之对称差symmetric_difference方法
a = {11, 22, 33}
b = {22}
temp1 = a.symmetric_difference(b) #合并不同项(求对称差)
print(temp1) #{33, 11}
print(a) #{33, 11, 22}
temp2 = a.symmetric_difference_update(b) #合并不同项,并更新a本身
print(temp2) #None
print(se) #{33, 11}
操作符和方法的等价性
s.update(t)
s |= t
返回增加了 set “t”中元素后的 set “s”
s.intersection_update(t)
s &= t
返回只保留含有 set “t”中元素的 set “s”
s.difference_update(t)
s -= t
返回删除了 set “t”中含有的元素后的 set “s”
s.symmetric_difference_update(t)
s ^= t
返回含有 set “t”或者 set “s”中有而不是两者都有的元素的 set “s”
判断
a = {11,22, 33}
b = {22, 33}
print(a.isdisjoint(b)) #判断是否不存在交集 False
#请注意, 没有isjoint(判断是否存在交集这种方法)
print(a.issubset(b)) #判断a是否是b的子集合 False
print(a.issuperset(b)) #判断a是否是b的父集合 True
转换
set = set(range(4)) #range(4)方法返回从0到4,不包括4的lsit
list = list(set)
tuple = tuple(set)
str = str(set)
print(type(list), list)
print(type(tuple), tuple)
print(type(str), str)