集合(set)与字典类似,也是由大括号{}表示,多个元素之间用逗号‘,’分隔。需要注意集合是无序且不重复的,集合中的元素必须是不可变数据(字符串,整数,元祖)。同数学中的集合一样,集合可以执行集合的并、交、差运算。注:对于 并集, 交集, 差集 等的返回值,与最左边的操作数具有相同的类型。例如:s & t 取交集。s集合是一个set类型的集合,t集合是一个frozenset类型的集合,则返回的结果将是set类型的集合。
集合有两种不同的类型,可变集合(set)和不可变集合:①可变集合可以添加或删除元素,但可变集合所存储的元素不能被哈希,因此不能用做字典的键;②不可变集合(frozenset)不能添加或删除元素,但元素是可哈希的,可以做字典的键
一、可变集合(set)
1、set的创建
# -*- coding:utf-8 -*-
# author: kenny
# 创建:用{}直接创建,也可以用工厂函数set()来创建
set_1 = {1, 2, 3, 4}
print(set_1) # {1, 2, 3, 4}
set_2 = set()
print(set_2) # set()
# 集合会把传入的字符串拆分为单个字符作为集合的成员
set_3 = set("java")
print(set_3) # {'a', 'j', 'v'}
# 当传入列表时,集合会把列表内的元素作为集合成员。
set_4 = set(['python', 'c', 'c++'])
print(set_4) # {'c', 'python', 'c++'}
# 空集合只能使用set()函数来定义,直接使用{}定义的是空字典
s1 = set()
s2 = {}
print(type(s1)) # <class 'set'>
print(type(s2)) # <class 'dict'>
2、增加
(1)set1.add('元素')--->将元素无序的插入集合set1中
set_1 = {1, 2, 3, 4}
set_1.add('java')
print(set_1) # {1, 2, 3, 4, 'java'}
(2)set1.update("元素")--->将元素迭代的无序的加入集合set1中
set_1 = {1, 2, 3, 4}
set_1.update("java")
print(set_1) # {1, 2, 3, 4, 'j', 'a', 'v'}
3、删除
(1)set1.pop()---->随机删除,返回值为删除掉的元素
set_1 = {1, 2, 3, 4}
s = set_1.pop()
print(set_1) # {2, 3, 4}
print(s) # 1
(2)set1.remove("元素")--->按元素删除,若无该元素则报错
set_1 = {1, 2, 3, 4}
set_1.remove(2)
print(set_1) # {1, 3, 4}
(3)set1.discard(obj)---->如果集合内存在指定元素,则删除,若不存在,不做任何事
set_1 = {1, 2, 3, 4}
set_1.discard(1)
print(set_1) # {2, 3, 4}
(4)set1.clear()--->清空集合。输出集合的时候是set(),为了与空字典{}相区分
set_1 = {1, 2, 3, 4}
set_1.clear()
print(set_1) # set()
(5)del set1------>删除整个集合
set_1 = {1, 2, 3, 4}
del set_1
print(set_1) # NameError: name 'set_1' is not defined
4、查找
因为集合是无序的,所以取某一个值,只能用for遍历
set_1 = {1, 2, 3, 4}
for i in set_1:
print(i, end=' ') # 1 2 3 4
print(set_1(1)) # TypeError: 'set' object is not callable
我们虽然不能直接查找集合,但是我们可以用in操作符查看集合中是否存在对象
set_1 = {1, 2, 'java'}
print('1' in set_1) # False
print(1 in set_1) # True
5、交集,并集,差集
s1 = {1, 'java', ('tuple_1', 'tuple_2', 3)}
s2 = {'do', 're', 'mi', 1, ('tuple_1', 'tuple_2', 3)}
s_jiao = s1 & s2
s_bing = s1 | s2
s_cha = s1 - s2
# 交集
print(s_jiao) # {1, ('tuple_1', 'tuple_2', 3)}
print(s1.intersection(s2)) # {1, ('tuple_1', 'tuple_2', 3)}
# 并集
print(s_bing) # {'re', 1, ('tuple_1', 'tuple_2', 3), 'java', 'mi', 'do'}
print(s1.union(s2)) # {'re', 1, ('tuple_1', 'tuple_2', 3), 'do', 'mi', 'java'}
# 差集
print(s_cha) # {'java'}
print(s1.difference(s2)) # {'java'}
# 对称差集:去掉交集后的元素
print(s1 ^ s2) # {'re', 'do', 'mi', 'java'}
print(s1.symmetric_difference(s2)) # {'java', 'mi', 'do', 're'}
# s1与s2取交集,然后用结果更新s1
s1.intersection_update(s2)
print(s1) # {1, ('tuple_1', 'tuple_2', 3)}
print(s2) # {1, ('tuple_1', 'tuple_2', 3), 'do', 'mi', 're'}
# s1与s2取差集,然后用结果更新s1
s1.difference_update(s2)
print(s1) # {'java'}
print(s2) # {'do', 1, 'mi', ('tuple_1', 'tuple_2', 3), 're'}
# s1与s2取对称差集,然后用结果更新s1
s1.symmetric_difference_update(s2)
print(s1) # {'mi', 'java', 'do', 're'}
print(s2) # {'mi', 1, 'do', 're', ('tuple_1', 'tuple_2', 3)}
二、不可变集合frozenset
不可变集合不可以增加删除集合中的元素,该集合中的内容是不可改变的,类似于字符串、元组。
不可变集合,除了内容不能更改外,其他功能及操作跟可变集合set一样
# 不可变集合的创建
fset = frozenset((1,2,3,4,5))
print(fset) # frozenset({1, 2, 3, 4, 5})