集合:(里面的元素是可哈希的,而集合的整体是不可哈希的)
:集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的。
特征:1、无序,不可重复 2、去重
set1 = {'1','alex',2,True,2,'alex'} print(set1) # {'1', True, 2, 'alex'}
无序,不可重复
# set1 = {'1','alex',2,True,[1,2,3]} # 报错 列表是不可哈希的 # set2 = {'1','alex',2,True,{1:2}} # 报错 字典是不可哈希的 # set3 = {'1','alex',2,True,(1,2,[2,3,4])} # 报错
去重
l = [1,2,1,2,3,4,5,5] set1 = set(l) print(set1) # {1, 2, 3, 4, 5} l = list(set1) print(l) # {1, 2, 3, 4, 5}
创建
set1 = {1,2,3} set2 = set({1,2,'barry'}) print(set1,set2) # {1, 2, 3} {1, 2, 'barry'}
集合:增 删 查
增
#增 add update(迭代添加) # add set1 = {'alex','lishi','rain','barry'} set1.add('jassin') print(set1) # {'rain', 'jassin', 'alex', 'barry', 'lishi'} #update(迭代添加) set1.update('A') print(set1) # {'lishi', 'alex', 'barry', 'rain', 'jassin', 'A'} set1.update('老师') print(set1) # {'lishi', 'alex', '老', 'barry', 'rain', 'jassin', 'A', '师'} set1.update([1,2,3]) print(set1) # {1, 2, 3, 'lishi', 'alex', '老', 'barry', 'rain', 'jassin', 'A', '师'
删
#删 remove:删除一个元素 pop:随机删,具有返回值 # clear :清空 del:删除集合 # remove set1 = {'alex','lishi','jassin','barry'} set1.remove('alex') # 删除一个元素 print(set1) # {'barry', 'jassin', 'lishi'} #pop 随机删,具有返回值 set1 = {'alex','lishi','jassin','barry'} set1.pop() print(set1) # {'alex', 'barry', 'jassin'} #clear 清空 set1 = {'alex','lishi','jassin','barry'} set1.clear() print(set1) # set() #del set1 = {'alex','lishi','jassin','barry'} del set1 # 删除集合 print(set1)
# 查 for
集合的其他操作
#交集: & 或者 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, 8} print(set2.union(set1)) # {1, 2, 3, 4, 5, 6, 7, 8}
#差集 : - 或者difference set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} print(set1 - set2) # {1, 2, 3} print(set1.difference(set2))
#反交集: ^ 或者 symmetric_difference set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} print(set1 ^ set2) print(set1.symmetric_difference(set2))
#子集与超集 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('barrt') print(s,type(s)) # frozenset({'r', 'a', 't', 'b'}) <class 'frozenset'>
赋值运算
#二、 深浅copy #1、 先看赋值运算 对于赋值运算来说,l1与l2指向的是同一个内存地址,所以他们是完全一样的。 l1 = [1,2,3,['barry','alex']] l2 = l1 l1[0] = 111 print(l1) # [111, 2, 3, ['barry', 'alex']] print(l2) # [111, 2, 3, ['barry', 'alex']] l1[3][0] = 'wusir' print(l1) # [111, 2, 3, ['wusir', 'alex']] print(l2) # [111, 2, 3, ['wusir', 'alex']]
#2、浅copy
对于浅copy来说,第一层创建的是新的内存地址,而从第二层开始,指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性。
l1 = [1, 2, 3, ['barry', 'alex']] l2 = l1.copy() print(l1, id(l1)) # [1, 2, 3, ['barry', 'alex']] 2380296895816 print(l2, id(l2)) # [1, 2, 3, ['barry', 'alex']] 2380296895048 l1[1] = 222 print(l1, id(l1)) # [1, 222, 3, ['barry', 'alex']] 2593038941128 print(l2, id(l2)) # [1, 2, 3, ['barry', 'alex']] 2593038941896 l1[3][0] = 'wusir' print(l1, id(l1[3])) # [1, 2, 3, ['wusir', 'alex']] 1732315659016 print(l2, id(l2[3])) # [1, 2, 3, ['wusir', 'alex']] 1732315659016 l1[3][0] = 'wusir' print(l1) # [111, 2, 3, ['wusir', 'alex']] print(l2) # [111, 2, 3, ['wusir', 'alex']]
#3,深拷贝deepcopy。 对于深copy来说,两个是完全独立的,改变任意一个的任何元素(无论多少层),另一个绝对不改变。 import copy l1 = [1,2,3,['barry','alex']] l2 = copy.deepcopy(l1) print(l1,id(l1)) # [1, 2, 3, ['barry', 'alex']] 2915377167816 print(l2,id(l2)) # [1, 2, 3, ['barry', 'alex']] 2915377167048 l1[1] = 222 print(l1,id(l1)) # [1, 222, 3, ['barry', 'alex']] 2915377167816 print(l2,id(l2)) # [1, 2, 3, ['barry', 'alex']] 2915377167048 l1[3][0] = 'wusir' print(l1,id(l1[3])) # [1, 222, 3, ['wusir', 'alex']] 2915377167240 print(l2,id(l2[3])) # [1, 2, 3, ['barry', 'alex']] 2915377167304