一、补充基础数据类型的相关知识点:
1、str.join() 把列表变成字符串
#1、字符串的插入 s = 'abc' s1 =s.join("张无忌") print(s1) #张abc无abc忌
#把列表变成字符串 ---> 如果要把字符串变成列表,把字符串变成列表就进行切片slipt() a = ["张无忌","周芷若","赵敏"] b = "_".join(a) print(b) #张无忌_周芷若_赵敏
#把字典变成字符串 a = {"碧瑶":"赵丽颖","王源":"张小凡","陆雪琪":"杨紫"} b = "*".join(a) print(b) #碧瑶*王源*陆雪琪
2、列表不能在循环的时候删除,因为索引会跟着改变
lis = ["张无忌","周芷若","赵敏","小昭"] # lis.clear() #一般使用clear可以清空列表,还可以使用其他方法 del_lis = [] for el in lis: #lis在循环的时候不能删除,因为索引会变 del_lis.append(el) #记录要删除的内容 for el in del_lis: #循环记录原来的内容 lis.remove(el) #删除原来的内容 print(lis) --------------------------------------------------- 例: #删除姓周的人 lis = ["周星驰","周树人","张无忌","周芷若"] del_lis = [] for el in lis: if el.startswith("周"): del_lis.append(el) for el in del_lis: lis.remove(el) print(lis)
3、字典也不能直接循环删除:(字典在循环的时候不能改变字典的大小)
方法:要把删除的内容记录在列表中,循环列表,删除原列表,字典中的数据
#除了白子画,其他的都删除 dic = {"花千骨":"赵丽颖","白子画":"霍建华","杀阡陌":"马可"} dic1 = {} for k,v in dic.items(): if "白" in k: dic1[k] = v dic = dic1 print(dic)
#删除字典
dic = {"紫薇":"林心如","小燕子":"赵薇","五阿哥":"苏有朋","皇阿玛":"张铁林","尔康":"周杰"}
lit = []
for el in dic:
lit.append(el) #将k添加新的列表中。
for el in lit:
dic.pop(el) #用字典删除k值。
print(dic)
4、formkeys() 不会对原来的字典产生影响。产生新的字典
a = dict.fromkeys(["张三丰","张无忌","周芷若"]," 赵敏") dic = {"a":"123"} print(dic) 结果:{'a': '123'} dict是一个类,dic是一个定义的变量 dic!=dict s = dic.fromkeys("杨逍","金毛狮王") print(s) 结果:{'杨': '金毛狮王', '逍': '金毛狮王'} #返回给一个新的字典
二、set() 集合:
1、特点:不重复,无序
注意: set集合中的元素必须是可hash的, 但是set本⾝是不可hash得. set是可变的.
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])} # 报错 #set中的元素是不重复的,且无序 s = {"张无忌","周芷若","周芷若"} print(s) #结果:{'周芷若', '张无忌'}
#使⽤用这个特性.我们可以使⽤用set来去掉重复
lis = ["赵丽颖","alex","张无忌","alex","赵丽颖"]
lis = set(lis)
print(lis)
#{'张无忌', 'alex', '赵丽颖'}
2、set()的增删改查
1、增 add() s = {"赵丽颖","张无忌","鹿晗"} s.add("杨紫") s.add("赵丽颖") #如果有重复的,不会再添加进去 print(s) #{'杨紫', '张无忌', '赵丽颖', '鹿晗'} update() s = {"赵丽颖","张无忌","鹿晗"} s.update("杨幂") print(s) #{'张无忌', '杨', '赵丽颖', '鹿晗', '幂'} 迭代更新 2、删 pop() s = {"赵丽颖","张无忌","鹿晗"} a = s.pop() #随机删除 print(a) #返回删除的值 print(s) remove() s = {"赵丽颖","张无忌","鹿晗"} s.remove("张无忌") #删除指定的值 print(s) clear() s = {"赵丽颖","张无忌","鹿晗"} s.clear() #清空set集合 print(s) 3、改 # set集合中的数据没有索引. 也没有办法去定位⼀个元素. 所以没有办法进行直接修改.我们可以采⽤先删除后添加的⽅式来完成修改操作 s = {"赵丽颖","张无忌","鹿晗"} s.remove("张无忌") s.add("杨幂") print(s) #结果:{'杨幂', '赵丽颖', '鹿晗'} 4、查 # set是⼀个可迭代对象. 所以可以进⾏for循环 s = {"赵丽颖","张无忌","鹿晗"} for el in s: print(el)
3、set集合本⾝是可以发⽣改变的. 是不可hash的. 我们可以使⽤frozenset来保存数据. frozenset是不可变的. 也就是⼀个可哈希的数据类型
s = frozenset(["赵丽颖","张无忌","鹿晗"]) #冻结set,使set不可变 dic = {s:"123"} print(dic)
#结果:{frozenset({'赵丽颖', '张无忌', '鹿晗'}): '123'}
三、数据类型的转换:
想转成什么就用什么括起来
元组 => 列表 list(tuple)
列表 => 元组 tuple(list)
list=>str str.join(list)
str=>list str.split()
转换成False的数据: 0,'',None,[],(),{},set() ==> False
四、深浅拷贝:
1、直接赋值:两个变量指向同一个对象。
对于list, set, dict来说, 直接赋值. 其实是把内存地址交给变量. 并不是复制⼀份内容. 所以. lst1的内存指向和lst2是⼀样的. lst1改变了, lst2也发生了改变 lst1 = ["赵丽颖","杨幂","鹿晗","古力娜扎"] lst2 = lst1 print(lst1) print(lst2) lst1.append("林心如") print(lst1) print(lst2) #结果:['赵丽颖', '杨幂', '鹿晗', '古力娜扎'] ['赵丽颖', '杨幂', '鹿晗', '古力娜扎'] ['赵丽颖', '杨幂', '鹿晗', '古力娜扎', '林心如'] ['赵丽颖', '杨幂', '鹿晗', '古力娜扎', '林心如'] dit1 = {"扶摇":"杨幂","无极太子":"阮经天"} dit2 = dit1 print(dit1) print(dit2) dit2["轩辕岳"] = "赖艺" print(dit1) print(dit2) #结果: {'扶摇': '杨幂', '无极太子': '阮经天'} {'扶摇': '杨幂', '无极太子': '阮经天'} {'扶摇': '杨幂', '无极太子': '阮经天', '轩辕岳': '赖艺'} {'扶摇': '杨幂', '无极太子': '阮经天', '轩辕岳': '赖艺'}
2、浅拷贝:只拷贝第一层内容。方法:copy() 、 [:]
lis = ["张无忌","周芷若","赵敏"] lis1 = lis.copy() #lis 和 lis1不是指向的同一个对象 # lis1 = lis[:] #切片产生新的对象 lis.append("小昭") print(lis) print(lis1) print(id(lis),id(lis1)) 结果: ['张无忌', '周芷若', '赵敏', '小昭'] ['张无忌', '周芷若', '赵敏'] 2795577984520 2795577985224
#两个lst完全不不⼀样. 内存地址和内容也不⼀样. 发现实现了内存的拷⻉
lis = ["张无忌","周芷若","赵敏",["林心如","陈乔恩","董璇"]]
lis1 = lis.copy()
lis[3].append("朴信惠")
print(lis)
print(lis1)
print(id(lis),id(lis1))
结果:
['张无忌', '周芷若', '赵敏', ['林心如', '陈乔恩', '董璇', '朴信惠']]
['张无忌', '周芷若', '赵敏', ['林心如', '陈乔恩', '董璇', '朴信惠']]
1696216631496 1696216631624
#浅拷⻉. 只会拷⻉第⼀层. 第⼆层的内容不会拷⻉. 所以被称为浅拷贝
3、深拷贝:对象中的所有内容都会被拷贝一份 导入模块import copy 方法:deepcopy()
import copy lis = ["张无忌","周芷若","赵敏",["林心如","陈乔恩","董璇"]] lis1 = copy.deepcopy(lis) lis[3].append("宋慧乔") print(lis) print(lis1) print(id(lis),id(lis1)) #结果: ['张无忌', '周芷若', '赵敏', ['林心如', '陈乔恩', '董璇', '宋慧乔']] ['张无忌', '周芷若', '赵敏', ['林心如', '陈乔恩', '董璇'] 2041544733384 2041544734664 都不⼀样了. 深度拷⻉. 把元素内部的元素完全进行拷⻉复制. 不会产⽣⼀个改变另⼀个跟着改变的问题
补充⼀个知识点: 最后我们来看⼀个⾯试题
a = [1,2] a[1] = a print(a[1]) 结果: [1, [...]]