- 列表
序列是Python中最基本的數(shù)據(jù)結(jié)構(gòu)。序列中的每個(gè)元素都分配一個(gè)數(shù)字- 它的位置嫩挤,或索引害幅,第一個(gè)索引是0,第二個(gè)索引是1岂昭,依此類推以现。
Python有6個(gè)序列的內(nèi)置類型,但最常見的是列表和元組约啊。
序列都可以進(jìn)行的操作包括索引邑遏,切片,加恰矩,乘记盒,檢查成員。
此外外傅,Python已經(jīng)內(nèi)置確定序列的長度以及確定最大和最小的元素的方法纪吮。
列表是最常用的Python數(shù)據(jù)類型,它可以作為一個(gè)方括號(hào)內(nèi)的逗號(hào)分隔值出現(xiàn)栏豺。
列表的數(shù)據(jù)項(xiàng)不需要具有相同的類型
創(chuàng)建一個(gè)列表彬碱,只要把逗號(hào)分隔的不同的數(shù)據(jù)項(xiàng)使用方括號(hào)括起來即可。
列表的一般用法:
list1 = ['frui','male',1989,'python',[2016,2017],'c'] #list內(nèi)元素的數(shù)據(jù)類型可以不同,也可以是另外一個(gè)list
list2 = ['']
print (list1)
使用下標(biāo)索引來訪問列表中的值奥洼,同樣你也可以使用方括號(hào)的形式截取字符,如下所示:
print (list1[:])
print (list1[0],list1[1])
print (list1[-1],list1[-2])
print (list1[0:3]) #切片,此操作顧頭不顧尾
print (list1[:3])
print (list1[-3:]) #切片晚胡,從后向前數(shù)索引灵奖,也只能從左往右切片,同樣是顧頭不顧尾估盘。(這樣會(huì)無法取到最后一個(gè)元素瓷患,思考怎么辦?)
print (list1[0:-1:2]) #按步長切片
print (list1[::2]) #按步長切片
list1.append("linux") #在列表末尾追加元素
list1.insert(1,"linux") #直接把元素插入的指定位置
list1[0] = "jay" #(改)直接替換某個(gè)位置元素
delete
list1.pop() #刪除list末尾的元素
list1.pop(1) #刪除指定位置的元素
del list1[0]
list1.remove("python") #此種方法和前兩種的區(qū)別是什么遣妥?
print (list1)
print (list1.index(1989)) #查找已知元素的索引
print (list1[list1.index(1989)])
print (list1.count(1989)) #打印某元素在列表中的數(shù)量
list1.clear() #清除整個(gè)列表
list1.reverse() #反轉(zhuǎn)整個(gè)列表
list1.sort() #排序 按ASCII碼順序排序,若元素中有l(wèi)ist類型擅编,則無法排序,為什么?
list2 = [1,2,3,4]
list1.extend(list2) #列表合并
print (list1)
del list2 #刪除整個(gè)變量
列表的深淺copy
淺拷貝只能拷貝最外層爱态,修改內(nèi)層則原列表和新列表都會(huì)變化谭贪。
深拷貝是指將原列表完全克隆一份新的。
import copy
list1 = ['frui','male',1989,'python',[2016,2017],'c']
list2 = list1.copy() #淺copy
list3 = copy.copy(list1) #淺copy锦担,同list1.copy()效果相同
list4 = copy.deepcopy(list1) #深copy俭识,會(huì)和list1占用同樣大小的內(nèi)存空間
list1[0] = '自由'
list1[4][0] = 2015
print (list1,'\n',list2,'\n',list3,'\n',list4)
列表的循環(huán):逐個(gè)打印列表元素
list1 = ['frui','male',1989,'python',[2016,2017],'c']
for i in list1:
print (i)
- 元組
元組也是存一組數(shù)據(jù),只是一旦創(chuàng)建洞渔,便不能修改套媚,所以又叫只讀列表。元組創(chuàng)建很簡單磁椒,只需要在括號(hào)中添加元素堤瘤,并使用逗號(hào)隔開即可。
tup1 = (1,2,3,4,5)
tup2 = ('frui', 27)
tup3 = "a", "b", "c", "d";
tup4 = () #創(chuàng)建空元組
元組中只包含一個(gè)元素時(shí)浆熔,需要在元素后面添加逗號(hào)
tuple5 = (50,) #元組中只包含一個(gè)元素時(shí)本辐,需要在元素后面添加逗號(hào)
tuple6 = (50)
如果不加逗號(hào),則定義的不是tuple蘸拔,是50這個(gè)數(shù)师郑!這是因?yàn)槔ㄌ?hào)()既可以表示tuple,又可以表示數(shù)學(xué)公式中的小括號(hào)调窍,這就產(chǎn)生了歧義宝冕,因此,Python規(guī)定邓萨,這種情況下地梨,按小括號(hào)進(jìn)行計(jì)算。
元組只有兩個(gè)方法:count和index
不可變的tuple有什么意義缔恳?因?yàn)閠uple不可變宝剖,所以代碼更安全。如果可能歉甚,能用tuple代替list就盡量用tuple万细。
- 字典
3.1 字典的使用
字典是另一種可變?nèi)萜髂P停铱纱鎯?chǔ)任意類型對(duì)象纸泄。
字典的每個(gè)鍵值對(duì)()用冒號(hào)(:)分割赖钞,每個(gè)對(duì)之間用逗號(hào)(,)分割,整個(gè)字典包括在花括號(hào)({})中 ,格式如下所示:
d = {key1 : value1, key2 : value2 }
鍵必須是唯一的聘裁,但值則不必雪营。值可以取任何數(shù)據(jù)類型,但鍵必須是不可變的衡便,如字符串献起,數(shù)字或元組洋访。
info = {
'stu1':"Xiao Ming",
'stu2':"Xiao Liang",
'stu3':"Xiao Hong",
'stu4':"Xiao Rui",
}
print (info)
修改
info['stu2'] = "Xiao Hu"
增加
info['stu5'] = "Xiao Fang"
刪除
info.pop('stu2')
del info['stu1']
info.popitem() #隨機(jī)刪一個(gè)
print (info)
info.clear() #清空字典所有條目
查找
print ('stu2' in info) #判斷是否存在,存在則返回True谴餐,否則返回False
print (info['stu1']) #如果一個(gè)key不存在姻政,就報(bào)錯(cuò),get不會(huì)总寒,不存在只返回None
dict.get(key, default=None)
返回指定鍵的值扶歪,如果值不在字典中返回default值
比較安全的查找方法
print (info.get('stu6'))
其他
print (info.values()) #打印所有的值(即除了key)
print (info.keys()) #打印所有的key
print (info.items()) #把字典轉(zhuǎn)化為列表
dict.setdefault(key, default=None)
和get()類似, 但如果鍵不存在于字典中,將會(huì)添加鍵并將值設(shè)為default
info.setdefault ('class3',{'Xiao Rui', 15})
print (info)
info.setdefault ('class1',{'Xiao Hong', 16})
print (info)
循環(huán)打印
for i in info:
print (i,info[i])
for k,v in info.items():
print (k, v)
多級(jí)字典嵌套及操作
info = {
'class1':{
'stu1':["Xiao Ming",16]
},
'class2':{
'stu2':["Xiao Liang",17]
}
}
info['class1']['stu1'][1] = 18
print (info)
dict.fromkeys(seq[, val]))
創(chuàng)建一個(gè)新字典摄闸,以序列 seq 中元素做字典的鍵善镰,val 為字典所有鍵對(duì)應(yīng)的初始值
eg:
print (dict.fromkeys([6,7,8],'test'))
c = dict.fromkeys([6,7,8],[1,{'name':'frui'}])
c[6][1]['name'] = 'sorui'
print (c)
update方法
info = {
'stu1':"Xiao Ming",
'stu2':"Xiao Liang",
'stu3':"Xiao Hong",
'stu4':"Xiao Rui",
}
b = {
'stu1': "Xiao Dong",
1:3,
2:4
}
print (info)
info.update(b)
為什么dict查找速度這么快?
因?yàn)閐ict的實(shí)現(xiàn)原理和查字典是一樣的年枕。假設(shè)字典包含了1萬個(gè)漢字炫欺,我們要查某一個(gè)字,一個(gè)辦法是把字典從第一頁往后翻熏兄,直到找到我們想要的字為止品洛,這種方法就是在list中查找元素的方法,list越大摩桶,查找越慢桥状。
第二種方法是先在字典的索引表里(比如部首表)查這個(gè)字對(duì)應(yīng)的頁碼,然后直接翻到該頁硝清,找到這個(gè)字辅斟。無論找哪個(gè)字,這種查找速度都非陈茫快士飒,不會(huì)隨著字典大小的增加而變慢。dict就是第二種實(shí)現(xiàn)方式蔗崎。
和list比較酵幕,dict有以下幾個(gè)特點(diǎn):
無序
查找和插入的速度極快,不會(huì)隨著key的增加而變慢缓苛;
需要占用大量的內(nèi)存芳撒,內(nèi)存浪費(fèi)多。
而list相反:
查找和插入的時(shí)間隨著元素的增加而增加未桥;
占用空間小番官,浪費(fèi)內(nèi)存很少。
所以钢属,dict是用空間來換取時(shí)間的一種方法。
dict可以用在需要高速查找的很多地方门躯,在Python代碼中幾乎無處不在淆党,正確使用dict非常重要,需要牢記的第一條就是dict的key必須是不可變對(duì)象。這是因?yàn)閐ict根據(jù)key來計(jì)算value的存儲(chǔ)位置染乌,如果每次計(jì)算相同的key得出的結(jié)果不同山孔,那dict內(nèi)部就完全混亂了。這個(gè)通過key計(jì)算位置的算法稱為哈希算法(Hash)荷憋。
要保證hash的正確性台颠,作為key的對(duì)象就不能變。在Python中勒庄,字符串串前、整數(shù)等都是不可變的,因此实蔽,可以放心地作為key荡碾。而list是可變的,就不能作為key:
- 集合
集合是一個(gè)無序的局装,不重復(fù)的數(shù)據(jù)組合坛吁,它的主要作用如下:
去重,把一個(gè)列表變成集合铐尚,就自動(dòng)去重了
關(guān)系測試拨脉,測試兩組數(shù)據(jù)之前的交集、差集宣增、并集等關(guān)系
常用操作
去重
list1 = [3,2,1,4,5,6,5,4,3,2,1]
print (list1, type(list1))
list1 = set(list1)
print (list1, type(list1))
list2 = set([4,5,6,7,8,9])
交集
print (list1.intersection(list2))
并集
print (list1.union(list2))
差集
print (list1.difference(list2))
print (list2.difference(list1))
子集玫膀、父集
print (list1.issubset(list2))
print (list1.issuperset(list2))
list3 = set([4,5,6])
print (list3.issubset(list2))
print (list2.issuperset(list3))
對(duì)稱差集
print (list1.symmetric_difference(list2))
Return True if two sets have a null intersection
list4 = set([1,2,3])
print (list3.isdisjoint(list4))
交集
print (list1 & list2)
union
print (list2 | list1)
difference
print (list1 - list2)
對(duì)稱差集
print (list1 ^ list2)
添加
list1.add(999) #添加一項(xiàng)
print (list1)
list1.update([66,77,88]) #添加多項(xiàng)
print (list1)
print (list1.add(999)) #猜猜打印什么?為什么
刪除
list1.remove(999)
print (list1)
remove and return arbitrary set element
print (list1.pop())
Remove an element from a set if it is a member.If the element is not a member, do nothing.
print (list1.discard(888))