集合是Python语言提供的内置数据结构,与列表、字典一样都属于可变类型的序列,集合是没有value的字典,集合中的元素不允许重复
集合的创建方式
使用花括号{}
s={1,2,3,4,5,5}
print(s,type(s))
使用内置函数set()
s1=set(range(6))
print(s1,type(s1)) #{0, 1, 2, 3, 4, 5} <class 'set'>
#集合中的元素不允许重复
s2=set([1,2,2,3])
print(s2,type(s2)) #{1, 2, 3} <class 'set'>
#集合中的元素是无序的
s3=set((1,2,3,3,5,65))
print(s3,type(s3)) #{65, 1, 2, 3, 5} <class 'set'>
s4=set('python')
print(s4,type(s4)) #{'y', 'h', 'p', 'n', 'o', 't'} <class 'set'>
s5=set({1,46,25,62,33,33,456})
print(s5,type(s5)) #{1, 33, 62, 456, 25, 46} <class 'set'>
定义一个空集合
s6=set()
print(type(s6)) #set() <class 'set'>
集合生成式
{ i/i*i for i in range(1,10) }
表示集合元素的表达式 自定义变量 可迭代对象
将{}修改成[]就是列表生成式 没有元组生成式
例:
s={ i*i for i in range(10)}
print(s) #{0, 1, 64, 4, 36, 9, 16, 49, 81, 25}
集合的相关操作
判断操作:in或not in
s={1,2,3,4,5,6}
print(s)
print(6 in s)
print(6 not in s)
新增操作:调用add()或update()方法
调用add()方法一次添加一个元素
s.add(111)
print(s) #{1, 2, 3, 4, 5, 6, 111}
调用**update()**方法至少添加一个元素
s.update({1234,341})
print(s)
s.update([100,200])
s.update((999,888))
print(s) #{1, 2, 3, 4, 5, 6, 100, 200, 999, 111, 1234, 341, 888}
删除操作:调用remove()或discard()或pop()方法
调用**remove()**方法,一次删除一个指定元素,如果指定的元素不存在抛出KeyError
s.remove(1)
print(s) #{2, 3, 4, 5, 6, 100, 200, 999, 111, 1234, 341, 888}
# s.remove(7) # KeyError: 7
调用**discard()**方法,一次删除一个指定元素,如果指定的元素不存在不抛出异常
s.discard(2)
print(s) #{3, 4, 5, 6, 100, 200, 999, 111, 1234, 341, 888}
s.discard(7) #指定的元素不存在不抛出异常
print(s) #{3, 4, 5, 6, 100, 200, 999, 111, 1234, 341, 888}
调用**pop()**方法,一次只删除一个任意元素,不能设置固定元素
s.pop()
print(s) #{4, 5, 6, 100, 200, 999, 111, 1234, 341, 888}
# s.pop(100) #TypeError: set.pop() takes no arguments (1 given)
清空集合:调用clear()方法
s.clear()
print(s) #set()
集合间的关系
相等:==或!=
s1={1,2,3}
s2={3,2,1}
s3={1,2}
s4={11,3,5}
print(s1==s2) #True
print(s1!=s2) #False
print(s1==s3) #False
子集:调用issubset方法进行判断
例:a是否是b的子集 a.issubset(b)
print(s3.issubset(s1)) #True
print(s4.issubset(s1)) #False
print(s1.issubset(s2)) #True
超集:调用issuperset方法进行判断
a是否是b的超集 a.issuperset(b) (超集与子集正好相反)
print(s1.issuperset(s3)) #True
print(s1.issuperset(s4)) #False
交集:调用isdisjoint方法进行判断
ab是否没有交集 a.isdisjoint(b) False有交集 True没有交集
print(s1.isdisjoint(s4)) #False
print(s3.isdisjoint(s4)) #True
集合的数学操作(操作后原集合不变)
交集操作:调用intersection()方法 使用&符号
s1={1,2,3,4,5}
s2={1,3,5,7,9}
print(s1.intersection(s2))
print(s1 & s2) #{1, 3, 5}
并集操作:调用union()方法 或 使用|符号
print(s1.union(s2))
print(s1 | s2) #{1, 2, 3, 4, 5, 7, 9}
差集操作:调用difference()函数 或 使用-符号
print(s1.difference(s2))
print(s1-s2) #{2, 4}
对称差集:调用symmetric_difference()方法 或 使用^符号
对称差集表示在A∪B里面,但不在A∩B里面
print(s1.symmetric_difference(s2)) #{2, 4, 7, 9}
print(s1 ^ s2) #{2, 4, 7, 9}