day07 python列表 集合 深浅拷贝

day07 python   一.知识点补充     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}            
上一篇:C++ | STL 浅谈list容器


下一篇:day07 知识点补充 集合 深浅拷贝