一.知识点补充 1."".join() s = "".join(('1','2','3','4','5')) #将字符串类型的可迭代的类型的每个元素按""引号中的东西拼接成字符串 print(s) 2.list 的for循环删元素的问题 lst = [1,2,3,4] for i in lst: lst.remove(i) print(lst) >>>[2, 4] #剩两个元素, 是因为有个变量来记录当前循环的位置, 如何解决 lst = [1,2,3,4] lst1 = lst[:] #循环新列表, 取出来的元素用来删老列表 for i in lst1: lst.remove(i) print(lst) 3.dict 在for 循环时不能改变大小, 但可以改value的值 dic = {1:1,2:2,3:3,4:4,5:5} for i in dic: dic.pop(i) print(dic) >>>RuntimeError: dictionary changed size during iteration #运行时错误, 不能删除, 也不能增加 如何解决 dic = {1:1,2:2,3:3,4:4,5:5} lst=[] for i in dic: lst.append(i) for i in lst: dic.pop(i) print(dic) #与列表一样, 循环新的, 删老的 4.{}.fromkeys() dic = {1:1,2:2,3:3,4:4,5:5} ret = dic.fromkeys('bajie', 'datang') #返回新的字典, 和原来的字典没有关系 ret1 = dict.fromkeys('abc', '666') #直接使用类名进行访问 print(dic) >>>{1: 1, 2: 2, 3: 3, 4: 4, 5: 5} print(ret) >>>{'b': 'datang', 'a': 'datang', 'j': 'datang', 'i': 'datang', 'e': 'datang'} print(ret1) >>>{'a': '666', 'b': '666', 'c': '666'} 里面的列表是共享的 lst = [1,2,3,4,5] ret = dict.fromkeys('abc', lst) lst.append(6) print(ret) >>>{'a': [1, 2, 3, 4, 5, 6], 'b': [1, 2, 3, 4, 5, 6], 'c': [1, 2, 3, 4, 5, 6]} #所有人用的是同一个列表(判断是不是一个内存地址) 二.集合 1.set() , 不重复, 无序的, 里面的元素必须是可哈希的(不可变): 就是没有value的字典, 也用{}表示: 集合本身是可变的, 不可哈希 lst = [1,2,2,3,4,5,6,45,345,3,2,3,2,3,23,4,432,342,4] lst = list(set(lst)) print(lst) #去重用集合, 很好用 2.增删改查(了解:用的时候回来看) 增 s = {1,2,3,4,5,6} s.add() #增加一个元素 s.update('bajie') #迭代增加 print(s) 删 print(s.pop()) #随机弹出一个, 有返回值, 返回被弹出的元素 print(s) s.remove(1) #删一个元素 s.clear() #清空 改 s.remove(2) #先删掉 s.add(6) #再添加 查 for i in s: #可用 for 循环 print(i) 3.集合的其他操作 交集 s1 = {1,2,3} s2 = {2,3,4} print(s1 & s2) print(s1.intersection(s2)) 并集 print(s1 | s2) print(s1.union(s2)) 差集 print(s1 - s2) print(s1.difference(s2)) #得到第一个中单独存在的 反交集 print(s1 ^ s2) print(s1.symmetric_difference(s2)) #两个集合单独存在的数据 子集 print(s1 < s2) print(s1.issubset(s2)) 超集 print(s1 > s2) print(s1.issubset(s2)) 4.frozenset() 是不可变的集合, 是可哈希的 5.哈希算法: 只要得到的结果是数字, 就认为是哈希算法 三.深浅拷贝 1.赋值拷贝:内存地址都相同 lst1 = [1,2,3,4,5,6] lst2 = lst1 #赋值操作时, 内存的地址相同(有嵌套时, 第二层内存地址也相同) lst1.append(7) print(id(lst1),id(lst2)) 2.浅拷贝:第一层内存地址相同, 第二层不同 lst2 = lst1[:] #浅拷贝,方式一 print(id(lst1),id(lst2)) #用切片取出来再赋值操作时, 内存地址就变了 lst2 = lst1.copy() #浅拷贝,方式二 print(id(lst1),id(lst2)) #内存地址不一样 lst1 = [1,2,3,4,5,6,[1,2,3,4,5,6]] #浅拷贝, 当有嵌套时, 只有第一层拷贝了, 第二层还是共用数据 lst2 = lst1.copy() print(id(lst1[6])) #第二层嵌套的内存地址相同 print(id(lst2[6])) 3.深拷贝:第一层和第二层内存地址都不同 import copy lst2 = copy.deepcopy(lst1) #深拷贝, 当有嵌套时, 所有层次都会拷贝 print(id(lst1[6])) #第二层嵌套的内存地址也变了 print(id(lst2[6])) 作业讲解 cars = ['京A34567','冀R44566', '京A55899','冀R44566','冀R44566'] locals = {'京':'北京','冀':'河北省'} rst = {} for i in cars: location = locals[i[0]] if not rst.get(location): rst[location] = 1 else: rst[location] += 1 print(rst) >>>{'北京': 2, '河北省': 3}
day07 知识点补充 集合 深浅拷贝
day07 知识点补充 集合 深浅拷贝