第七章 组合数据-3集合Set
set是一个无序且不重复的元素在{}中用逗号隔开,元素为不可变对象。类似数学里集合的概念,我们可以对集合进行求差集、交集、并集等运算。如果这些基本概念不太懂,请做下面的选择题:
A跳过本节,不学了 B自己查查集合的概念和操作 C接着往下看看 D随便
我猜你选择C,所以接着看看能不能懂吧。
s1 = set('alvin') #创建集合s1
s2= frozenset('yuan') #创建冻结的集合s2,冻结后集合不能再添加或删除任何元素。
print(s1,type(s1)) #{'l', 'v', 'i', 'a', 'n'} <class 'set'>
print(s2,type(s2)) #frozenset({'n', 'y', 'a', 'u'}) <class 'frozenset'>
print('a' in s1) #True
print('b' in s1) #False
for i in s1:
print(i)
集合本身是无序的,所以不能为集合创建索引或切片操作,只能循环遍历或使用in、not in来访问或判断集合元素。
集合可使用以下方法来更新,但是注意只有可变集合才能更新,frozenset不可以更新。
s.add() 和 s.update()
#s1 = frozenset('alvin')
#print(s1) #frozenset({'a', 'n', 'i', 'v', 'l'})
#s1.add("ccdc") #AttributeError: 'frozenset' object has no attribute 'add'
s2 = set('alvin')
s2.add('mm')
print(s2) # {'mm', 'l', 'n', 'a', 'i', 'v'}
s2.update('HO') # 添加多个元素
print(s2) # {'mm', 'l', 'n', 'a', 'i', 'H', 'O', 'v'}
删除集合可以使用s.remove()
s2 = set('alvin')
print(s2) # { 'l', 'n', 'a', 'i', 'v'}
s2.remove('l')
print(s2) # {'n', 'a', 'i','v'}
del s2 #删除集合本身
#print(s2) #NameError: name 's2' is not defined
集合类型操作符
in ,not in
集合等价与不等价(==, !=)
子集、超集
s=set('alvinyuan')
s1=set('alvin')
print('v' in s) # True
print(s1<s) # True
联合(union)操作与集合的or操作其实等价的,联合符号有个等价的方法,union()。
s1=set('alvin')
s2=set('yuan')
s3=s1|s2 #or操作
print(s3) #{'a', 'l', 'i', 'n', 'y', 'v', 'u'}
print(s1.union(s2)) #{'a', 'l', 'i', 'n', 'y', 'v', 'u'}
交集(&)与集合and等价,交集符号的等价方法是intersection()
s1=set('alvin')
s2=set('yuan')
s3=s1&s2 #and操作
print(s3) #{'n', 'a'}
print(s1.intersection(s2)) #{'n', 'a'}
差集(-),等价方法是difference()
s1=set('alvin')
s2=set('yuan')
s3=s1-s2
print(s3) #{'v', 'i', 'l'}
print(s1.difference(s2)) #{'v', 'i', 'l'}
对称差集(^),对称差分是集合的XOR(‘异或’),取得的元素属于s1,s2但不同时属于s1和s2.其等价方法symmetric_difference()
s1=set('alvin')
s2=set('yuan')
s3=s1^s2
print(s3) #{'l', 'v', 'y', 'u', 'i'}
print(s1.symmetric_difference(s2)) #{'l', 'v', 'y', 'u', 'i'}
'''去重方式'''
lis = [1,2,3,4,1,2,3,4]
print(list(set(lis))) #[1, 2, 3, 4]