字符串跟列表的恩怨、set集合、数据转换、深浅拷贝
一、補(bǔ)充基礎(chǔ)數(shù)據(jù)類型的相關(guān)知識點:
1、str.join() 把列表變成字符串
#1、字符串的插入 s = 'abc' s1 =s.join("張無忌") print(s1) #張abc無abc忌#把列表變成字符串 ---> 如果要把字符串變成列表,把字符串變成列表就進(jìn)行切片slipt() a = ["張無忌","周芷若","趙敏"] b = "_".join(a) print(b) #張無忌_周芷若_趙敏
#把字典變成字符串 a = {"碧瑤":"趙麗穎","王源":"張小凡","陸雪琪":"楊紫"} b = "*".join(a) print(b) #碧瑤*王源*陸雪琪
2、列表不能在循環(huán)的時候刪除,因為索引會跟著改變
lis = ["張無忌","周芷若","趙敏","小昭"] # lis.clear() #一般使用clear可以清空列表,還可以使用其他方法 del_lis = [] for el in lis: #lis在循環(huán)的時候不能刪除,因為索引會變del_lis.append(el) #記錄要刪除的內(nèi)容 for el in del_lis: #循環(huán)記錄原來的內(nèi)容lis.remove(el) #刪除原來的內(nèi)容 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、字典也不能直接循環(huán)刪除:(字典在循環(huán)的時候不能改變字典的大小)
方法:要把刪除的內(nèi)容記錄在列表中,循環(huán)列表,刪除原列表,字典中的數(shù)據(jù)
#除了白子畫,其他的都刪除 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() 不會對原來的字典產(chǎn)生影響。產(chǎn)生新的字典
a = dict.fromkeys(["張三豐","張無忌","周芷若"]," 趙敏") dic = {"a":"123"} print(dic) 結(jié)果:{'a': '123'} dict是一個類,dic是一個定義的變量 dic!=dicts = dic.fromkeys("楊逍","金毛獅王") print(s) 結(jié)果:{'楊': '金毛獅王', '逍': '金毛獅王'} #返回給一個新的字典?二、set() 集合:
1、特點:不重復(fù),無序
注意: 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中的元素是不重復(fù)的,且無序 s = {"張無忌","周芷若","周芷若"} print(s) #結(jié)果:{'周芷若', '張無忌'}#使?用這個特性.我們可以使?用set來去掉重復(fù)
lis = ["趙麗穎","alex","張無忌","alex","趙麗穎"]
lis = set(lis)
print(lis)
#{'張無忌', 'alex', '趙麗穎'}
2、set()的增刪改查
1、增 add() s = {"趙麗穎","張無忌","鹿晗"} s.add("楊紫") s.add("趙麗穎") #如果有重復(fù)的,不會再添加進(jìn)去 print(s) #{'楊紫', '張無忌', '趙麗穎', '鹿晗'} update() s = {"趙麗穎","張無忌","鹿晗"} s.update("楊冪") print(s) #{'張無忌', '楊', '趙麗穎', '鹿晗', '冪'} 迭代更新2、刪 pop() s = {"趙麗穎","張無忌","鹿晗"} a = s.pop() #隨機(jī)刪除 print(a) #返回刪除的值 print(s)remove() s = {"趙麗穎","張無忌","鹿晗"} s.remove("張無忌") #刪除指定的值 print(s)clear() s = {"趙麗穎","張無忌","鹿晗"} s.clear() #清空set集合 print(s)3、改 # set集合中的數(shù)據(jù)沒有索引. 也沒有辦法去定位?個元素. 所以沒有辦法進(jìn)行直接修改.我們可以采?先刪除后添加的?式來完成修改操作 s = {"趙麗穎","張無忌","鹿晗"} s.remove("張無忌") s.add("楊冪") print(s) #結(jié)果:{'楊冪', '趙麗穎', '鹿晗'}4、查 # set是?個可迭代對象. 所以可以進(jìn)?for循環(huán) s = {"趙麗穎","張無忌","鹿晗"} for el in s:print(el)3、set集合本?是可以發(fā)?改變的. 是不可hash的. 我們可以使?frozenset來保存數(shù)據(jù). frozenset是不可變的. 也就是?個可哈希的數(shù)據(jù)類型
s = frozenset(["趙麗穎","張無忌","鹿晗"]) #凍結(jié)set,使set不可變 dic = {s:"123"} print(dic)#結(jié)果:{frozenset({'趙麗穎', '張無忌', '鹿晗'}): '123'}
三、數(shù)據(jù)類型的轉(zhuǎn)換:
想轉(zhuǎn)成什么就用什么括起來
元組 => 列表 ? ? ?? list(tuple)
列表 => 元組 ? ? ?? tuple(list)
list=>str ?? str.join(list)
str=>list ?? str.split()
轉(zhuǎn)換成False的數(shù)據(jù): 0,'',None,[],(),{},set() ==> False
四、深淺拷貝:
1、直接賦值:兩個變量指向同一個對象。
對于list, set, dict來說, 直接賦值. 其實是把內(nèi)存地址交給變量. 并不是復(fù)制?份內(nèi)容. 所以. lst1的內(nèi)存指向和lst2是?樣的. lst1改變了, lst2也發(fā)生了改變 lst1 = ["趙麗穎","楊冪","鹿晗","古力娜扎"] lst2 = lst1 print(lst1) print(lst2) lst1.append("林心如") print(lst1) print(lst2) #結(jié)果:['趙麗穎', '楊冪', '鹿晗', '古力娜扎']['趙麗穎', '楊冪', '鹿晗', '古力娜扎']['趙麗穎', '楊冪', '鹿晗', '古力娜扎', '林心如']['趙麗穎', '楊冪', '鹿晗', '古力娜扎', '林心如']dit1 = {"扶搖":"楊冪","無極太子":"阮經(jīng)天"} dit2 = dit1 print(dit1) print(dit2) dit2["軒轅岳"] = "賴藝" print(dit1) print(dit2) #結(jié)果: {'扶搖': '楊冪', '無極太子': '阮經(jīng)天'} {'扶搖': '楊冪', '無極太子': '阮經(jīng)天'} {'扶搖': '楊冪', '無極太子': '阮經(jīng)天', '軒轅岳': '賴藝'} {'扶搖': '楊冪', '無極太子': '阮經(jīng)天', '軒轅岳': '賴藝'}2、淺拷貝:只拷貝第一層內(nèi)容。方法:copy()? 、 [:]
lis = ["張無忌","周芷若","趙敏"] lis1 = lis.copy() #lis 和 lis1不是指向的同一個對象 # lis1 = lis[:] #切片產(chǎn)生新的對象 lis.append("小昭") print(lis) print(lis1) print(id(lis),id(lis1))結(jié)果: ['張無忌', '周芷若', '趙敏', '小昭'] ['張無忌', '周芷若', '趙敏'] 2795577984520 2795577985224#兩個lst完全不不?樣. 內(nèi)存地址和內(nèi)容也不?樣. 發(fā)現(xiàn)實現(xiàn)了內(nèi)存的拷?
lis = ["張無忌","周芷若","趙敏",["林心如","陳喬恩","董璇"]]
lis1 = lis.copy()
lis[3].append("樸信惠")
print(lis)
print(lis1)
print(id(lis),id(lis1))
結(jié)果:
['張無忌', '周芷若', '趙敏', ['林心如', '陳喬恩', '董璇', '樸信惠']]
['張無忌', '周芷若', '趙敏', ['林心如', '陳喬恩', '董璇', '樸信惠']]
1696216631496 1696216631624
#淺拷?. 只會拷?第?層. 第?層的內(nèi)容不會拷?. 所以被稱為淺拷貝
3、深拷貝:對象中的所有內(nèi)容都會被拷貝一份 ?? 導(dǎo)入模塊import copy ?? 方法:deepcopy()
import copy lis = ["張無忌","周芷若","趙敏",["林心如","陳喬恩","董璇"]] lis1 = copy.deepcopy(lis) lis[3].append("宋慧喬") print(lis) print(lis1) print(id(lis),id(lis1)) #結(jié)果: ['張無忌', '周芷若', '趙敏', ['林心如', '陳喬恩', '董璇', '宋慧喬']] ['張無忌', '周芷若', '趙敏', ['林心如', '陳喬恩', '董璇'] 2041544733384 2041544734664都不?樣了. 深度拷?. 把元素內(nèi)部的元素完全進(jìn)行拷?復(fù)制. 不會產(chǎn)??個改變另?個跟著改變的問題補(bǔ)充?個知識點: 最后我們來看?個?試題
a = [1,2] a[1] = a print(a[1]) 結(jié)果: [1, [...]]?
轉(zhuǎn)載于:https://www.cnblogs.com/LW-5208/articles/9289197.html
總結(jié)
以上是生活随笔為你收集整理的字符串跟列表的恩怨、set集合、数据转换、深浅拷贝的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。