集合 set:
set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
要创建一个set,需要提供一个list作为输入集合。
>>> s = set([1, 2, 3]) >>> s {1, 2, 3}
注意,传入的参数[1, 2, 3]
是一个list,而显示的{1, 2, 3}
只是告诉你这个set内部有1,2,3这3个元素,显示的顺序也不表示set是有序的。。
重复元素在set中自动被过滤:
>>> s = set([1, 1, 2, 2, 3, 3]) >>> s {1, 2, 3}
通过add(key)
方法可以添加元素到set中,可以重复添加,但不会有效果:
>>> s.add(4) >>> s {1, 2, 3, 4} >>> s.add(4) >>> s {1, 2, 3, 4}
通过remove(key)
方法可以删除元素:
>>> s.remove(4) >>> s {1, 2, 3}
set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:
>>> s1 = set([1, 2, 3]) >>> s2 = set([2, 3, 4]) >>> s1 & s2 {2, 3} >>> s1 | s2 {1, 2, 3, 4}
set和dict的唯一区别仅在于没有存储对应的value,但是,set的原理和dict一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。试试把list放入set,看看是否会报错。
集合的其他操作:
交集。(& 或者 intersection) set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} print(set1 & set2) # {4, 5} print(set1.intersection(set2)) # {4, 5} 并集。(| 或者 union set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} print(set1 | set2) # {1, 2, 3, 4, 5, 6, 7} print(set2.union(set1)) # {1, 2, 3, 4, 5, 6, 7} 差集。(- 或者 difference) set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} print(set1 - set2) # {1, 2, 3} print(set1.difference(set2)) # {1, 2, 3} 反交集。 (^ 或者 symmetric_difference) set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} print(set1 ^ set2) # {1, 2, 3, 6, 7, 8} print(set1.symmetric_difference(set2)) # {1, 2, 3, 6, 7, 8} 子集与超集 set1 = {1,2,3} set2 = {1,2,3,4,5,6} print(set1 < set2) print(set1.issubset(set2)) # 这两个相同,都是说明set1是set2子集。 print(set2 > set1) print(set2.issuperset(set1)) # 这两个相同,都是说明set2是set1超集。 frozenset不可变集合,让集合变成不可变类型 s = frozenset('barry') print(s,type(s)) # frozenset({'a', 'y', 'b', 'r'}) <class 'frozenset'>
深浅copy:
#浅copy第一层在内层中时独立的,第二层开始以及更深的层次开始可以更改。 # li = [1,2,3] # l2 = li.copy() # li.append(666) # print(l2) #深copy 这两个时完全独立的,互不影响 #应用场景:完全独立的copy一分数据,与原数据没关系,深copy。如果一方数据(列表)第二层时,你想与元数据进行公用。 #面试题: # l1 = [1,2,3,[22,33]] # l2 = l1[:] # l1.append(66) # # l1[-1].append(66) # print(l2) # import copy # l1 =[1,2,3,[22,]] # l2 = copy.deepcopy(l1) # # print(l1,l2) # l1[-1].append('taibai') # print(l2) # set1 = set({1,2,'baarry'}) # set2 = {1,2,'barry'} # print(set1,set2) # set1 = {'alex','wusir','ritian','egon','barry'} # set1.update('A') # print(set1) # set1.update('老师') # print(set1) # set1.update([1,2,3]) # print(set1)