版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第2章 Python序列2.0 序列(sequence)序列:是一系列連續(xù)值(對象),它們通常是相關(guān)的,并且按一定順序排列。序列是一種容器對象,其每個組成部分稱為“元素”(element)。序列是程序設(shè)計中經(jīng)常用到的數(shù)據(jù)存儲方式,幾乎每一種程序設(shè)計語言都提供了類似于序列的數(shù)據(jù)結(jié)構(gòu),如C和Basic中的一維、多維數(shù)組等。Python提供的序列類型在所有程序設(shè)計語言中是最豐富,最靈活,也是功能最強大的。2.0 序列Python中常用的序列結(jié)構(gòu)有列表、元組、字典*、字符串、集合*以及range等等。有序和無序:元素是否按序存放可變和不可變:容器對象一旦創(chuàng)建后是否允許修改可變不可變有序列表, arra
2、y元組*、字符串無序字典、集合有序序列(列表、元組、字符串)支持雙向索引,第一個元素下標為0,第二個元素下標為1,以此類推;最后一個元素下標為-1,倒數(shù)第二個元素下標為-2,以此類推。* 在有些表述中,字典和集合不屬于序列,稱為映射(map)。* 元組的元素(所引用對象)的值可變。元素是否要求為同一種類型? 字符串str:必須是字符數(shù)組array:與list一致,只是其元素必須是同一種類型的對象,而且該類型為字符、整數(shù)或者浮點數(shù)等。array的基本類型在創(chuàng)建對象時指定import arrayarr = array.array(i,1,2,3,4) # 元素為帶符號整數(shù)2.1 列表2.1 列表(
3、list)列表是Python中內(nèi)置可變序列,是若干元素的有序集合。列表中的每一個數(shù)據(jù)稱為元素,列表的所有元素放在一對中括號“”和“”中,并使用逗號分隔開;列表是容器(container)對象:一個列表中的元素可以是任意類型的數(shù)據(jù),比如整數(shù)、實數(shù)、字符串等基本類型,也可是列表、元素、字典、集合以及其他自定義類型。列表中每個元素的數(shù)據(jù)類型也可各不相同。list1 = 10, 20, 30, 40list2 =crunchy frog, ram bladder, lark vomitlist3 =spam, 2.0, 5, 10, 20list4 =file1, 200,7, file2, 260,
4、92.1 列表列表(有序序列)元素的訪問 list_objindex 由于列表是有序序列,可以通過下標來訪問列表中某個元素。第一個元素下標為0,第二個元素下標為1,以此類推,直到len(seq)-1;最后一個元素下標為-1,倒數(shù)第二個元素下標為-2,以此類推,直到-len(seq) 。下標 -i 對應(yīng)于 len(seq)-i ,合法下標為 -len(seq), len(seq)-1如果下標越界,程序會報錯(Exception IndexError) 。s = 10, 20, 30, 40, 50len(s)5s010 s-150012340,5)1020304050len(s)=5-5-4-3
5、-2-1-5,0)內(nèi)置函數(shù): len(obj)返回容器對象obj中的元素的個數(shù) s5Traceback (most recent call last): File , line 1, in s5IndexError: list index out of range回顧:Python對象、變量與賦值2.1 列表注意:列表和列表元素是不同的對象。列表中包含的是元素值(對象)的引用,而不是直接包含元素值。列表對象是可變的,可以增加或刪除列表元素,也可以修改列表元素。增加或刪除時,解釋器會保證列表元素仍然是按序連續(xù)存放的) li=100, “123”,1,2 id(li) 53963080 id(li
6、0)1350630288 id(li1)546527442.1 列表:列表對象的賦值(修改)當(dāng)為變量(保存了對象的引用)賦值時,并不是真的直接修改變量所指的對象的值,而是使變量指向新的值(對象),通過下標訪問的列表對象的元素類似于以前介紹的變量列表對象的元素也可以賦值(即修改該元素),出現(xiàn)在賦值語句的左邊LHS,相當(dāng)于該列表對象的相應(yīng)元素指向一個新的對象如果列表元素本身也是一個可變對象(比如列表),可以通過下標來修改該列表元素的值 a = 3, 5, 7 b = 3, 5, 7 c = a c3, 5, 7 c1 = 8 a3, 8, 7 b3, 5, 7 a is cTrue id(a),
7、id(b), id(c)(2818633085448, 2818632343880, 2818633085448) d = 1, 2, 3, 4 len(d)3 d10 = -2 d1, -2, 3, 4列表的應(yīng)用: 二維數(shù)組(矩陣)可以用列表的列表來表示,如例子中的array1array1的元素為矩陣的行,下標為i的元素對應(yīng)第i+1行array1ij左結(jié)合,array1i得到第i+1行,然后array1ij得到矩陣的第i+1行第j+1列的元素#二維數(shù)組的訪問:array1 = 1, 2, 3, 4, 5, 6, 7,8,9 array101, 2, 3 array1001 array1126
8、1 2 3 4 5 67 8 92.1 列表列表元素的修改:可以通過下標來修改序列中元素的值。通過可變序列對象自身提供的方法來增加和刪除元素,對元素進行排序等: listobj.method(.) del語句來刪除元素: del list_objindex 列表還支持一些運算符: + * in += *= 等 可通過切片來訪問、修改、增加和刪除元素注意: 如果是通過下標來修改序列中元素的值或通過可變序列對象自身提供的方法來增加和刪除元素時,序列對象在內(nèi)存中的起始地址(或者引用)是不變的,僅僅是被改變值的元素地址發(fā)生變化。 變的是序列對象的元素,比如新增了元素或者刪除了元素,或者元素指向了另一個
9、對象,或者元素所指向?qū)ο蟮闹蹈淖?。注:書中P37的上述表述不嚴格列表方法方法說明list.append(x)將元素x添加至列表尾部list.extend(L)將列表L中所有元素添加至列表尾部list.insert(index,x)在列表指定位置index處添加元素xlist.remove(x)在列表中刪除首次出現(xiàn)的指定元素list.pop(index)刪除并返回列表對象指定位置的元素list.clear()刪除列表中所有元素,但保留列表對象,該方法在Python2中沒有l(wèi)ist.index(x)返回值為x的首個元素的下標list.count(x)返回指定元素x在列表中的出現(xiàn)次數(shù)list.rev
10、erse()對列表元素進行原地逆序list.sort()對列表元素進行原地排序list.copy()返回列表對象的淺拷貝,該方法在Python2中沒有del list_vardel list_varindexlist_varindexx in list_var x not in list_var切片slicing: 獲得列表中的多個元素增加刪除查找列表相關(guān)的運算符: + * in 比較(= 等) ,還有+= *= 其他2.1.1 列表創(chuàng)建與刪除如同其他類型的Python對象變量一樣,可以使用list literal來創(chuàng)建對象。列表literal通過中括號表示。例如: a_list = a, b
11、, mpilgrim, z, example a_list = #創(chuàng)建空列表也可以使用list(iterable)函數(shù)創(chuàng)建一個新的列表對象list函數(shù)的參數(shù)可以為空,這時產(chǎn)生空列表對象list函數(shù)的參數(shù)可以為可迭代(iterable)對象(比如列表、range對象、字符串、元組、字典等)新的列表對象的每個元素指向可迭代對象中各個元素指向的對象 a_list = list(3,5,7,9,11) a_list3, 5, 7, 9, 11 list(range(1,10,2)1, 3, 5, 7, 9 list(hello world)h, e, l, l, o, , w, o, r, l, d
12、x = list() #創(chuàng)建空列表 x構(gòu)造新的列表list(iterable):創(chuàng)建一個新的列表對象,同時每個元素指向可迭代對象中各個元素指向的對象列表對象的copy()方法:創(chuàng)建一個新的列表對象,同時該對象的每個元素指向原列表對象的對應(yīng)位置的元素在列表中的元素所指對象為可變對象時需要小心,可能有多個引用指向它,通過一個引用改變該對象的值,其他引用也同樣會受到影響list_a=1,2,-3,4 list_b = list(list_a) # 區(qū)分list_b = list_alist_c = list_a.copy() list_c1 = -2 list_b0 = -1 list_b20 =
13、3 print(list_b) -1, 2, 3, 4print(list_a) 1, 2, 3, 4 print(list_c)1, -2, 3, 4 補充: 可迭代對象iterable、迭代器iteratoriterable對象包含一個_iter_()方法,通過調(diào)用其得到一個迭代器iteratoriterable對象包括: str,list,tuple,dict,set,range等內(nèi)置函數(shù) iter(iterable)會返回一個iterator iterator: 包含_next_()方法,調(diào)用其獲得下一個元素,如果沒有更多的元素時拋出異常StopIteration迭代器一般也是可迭代對
14、象,其_iter_()方法返回就是自身內(nèi)置函數(shù)next(iterator)從迭代器返回下一個元素,沒有更多的元素時拋出異常StopIteration內(nèi)置函數(shù)sorted(), reversed(),zip(),enumerate() 等返回的對象也是一個迭代器對象使用for循環(huán)來訪問iterable對象的元素該for循環(huán)會首先調(diào)用iter(iterable)獲得一個迭代器對象然后取迭代器對象的下一個元素,執(zhí)行一系列語句然后取下一個元素執(zhí)行,再次執(zhí)行一系列語句直到取下一個元素出現(xiàn)StopIteration時循環(huán)結(jié)束 for item in iterable: # for 循環(huán)體,item為ite
15、rable對象的各個元素 pass s = 0,1,2,3,4#s = range(5)for item in s: print(item)01234如果for循環(huán)中的容器對象為iterator對象時,需要小心: r = reversed(range(5)for i in r: print(i)print(another loop)for i in r: print(i)2.1.1 列表創(chuàng)建與刪除內(nèi)置函數(shù)range() 語法為range(stop)range(start, stop, step)該函數(shù)在Python 3.x中返回一個range可迭代對象* ,產(chǎn)生一系列的整數(shù),范圍start,s
16、top) 半閉半開區(qū)間參數(shù)start表示起始值(默認為0)參數(shù)stop表示終止值(結(jié)果中不包括這個值)參數(shù)step可選,表示步長(默認為1)可以用list()函數(shù)將range對象轉(zhuǎn)化為列表 range(10)range(0, 10) list(range(10)0, 1, 2, 3, 4, 5, 6, 7, 8, 9* range對象的訪問效率比轉(zhuǎn)化后的list對象高Python2.x有range和xrange兩個函數(shù),range返回一個list,而xrange返回一個iterable對象Python3的range相當(dāng)于xrange2.1.1 列表創(chuàng)建與刪除: 刪除列表對象當(dāng)不再使用時,使用d
17、el命令刪除整個列表 解除列表變量與列表對象之間的綁定,如果列表對象變量所指向的值(對象)不再有其他對象變量指向它,Python內(nèi)部會自動回收(刪除)該值(對象)。 del a_list a_listTraceback (most recent call last): File , line 1, in a_listNameError: name a_list is not defined正如上面的代碼所展示的一樣,刪除列表對象a_list之后,該對象刪除列表對象變量之后,該變量就不存在了,再次訪問時將拋出異?!癗ameError”提示訪問的對象變量名不存在。2.1.2 列表元素的增加添加元素
18、:尾部添加一個,尾部添加多個,指定位置添加一個(1)可以使用“+”運算符來實現(xiàn)將多個元素添加到列表中的功能。雖然這種用法在形式上比較簡單也容易理解,但嚴格意義上來講,這并不是真的為列表添加元素,而是創(chuàng)建一個新列表,并將原列表中的元素和新元素依次復(fù)制到新列表的內(nèi)存空間。由于涉及大量元素的復(fù)制,該操作速度較慢,在涉及大量元素添加時不建議使用該方法。 (請參見書上P36的程序比較不同列表元素增加方法的性能)+ 思考題:請思考如何判定是創(chuàng)建了新列表? aList = 3,4,5 aList = aList + 7 aList3, 4, 5, 72.1.2 列表元素的增加(2)使用乘法來擴展列表對象,將
19、列表與整數(shù)相乘,生成一個新列表,新列表是原列表中元素的重復(fù),相當(dāng)于原列表出現(xiàn)多次。 新列表中的元素會指向原列表中元素所指向的對象 注意:該操作實際創(chuàng)建一個新列表,而不是原地修改。該操作同樣適用于字符串、元組,并具有相同的特點。當(dāng)使用“*”運算符將包含列表的列表重復(fù)并創(chuàng)建新列表時,注意到列表元素保存的是對象的引用,因此每個重復(fù)元素所指向?qū)ο螅ǖ刂罚┦窍嗤摹?9頁最后一節(jié)表述有偏差 創(chuàng)建對象的引用? 列表元素為可變對象時需要特別注意 aList = 1, 2, 3 bList = aList*3 bList1, 2, 3, 1, 2, 3, 1, 2, 3 aList1, 2, 3 x = N
20、one * 2 * 3 xNone, None, None, None, None, None x0 is x1True x00 = 4 x 4, None, 4, None, 4, None x = 1,2,3*3 x # x0 x1 x2指向同一個列表對象1,2,3 1, 2, 3, 1, 2, 3, 1, 2, 3 x00 = 10 x10, 2, 3, 10, 2, 3, 10, 2, 3x的三個元素都指向同一個列表對象,該對象初始的值為None, None2.1.2 列表元素的增加(3)使用列表對象的append()方法,原地修改列表,是真正意義上的在列表尾部添加元素,速度較快,也是
21、推薦使用的方法。 aList = 3, 4, 5, 7 aList.append(9) aList3, 4, 5, 7, 9 aList.append(10)3, 4, 5, 7, 9,10+ 思考題:請思考如何判定是原地修改列表?2.1.2 列表元素的增加(4)使用列表對象的extend()方法可以將另一個迭代對象(tuple、str、list、range等)的所有元素添加至該列表對象尾部。通過extend()方法來增加列表元素也不改變列表對象的內(nèi)存首地址,屬于原地操作。 a = 5, 2, 4 id(a)54728008 a.extend(7,8,9) a.extend(10,11) a5
22、, 2, 4, 7, 8, 9, 10, 11 id(a)547280082.1.2 列表元素的增加(5) 復(fù)合賦值語句 list_obj += iterable等價于list_obj.extend(iterable) 復(fù)合賦值*=與*運算類似,只是原地重復(fù),比如 list_obj *= 3 等價于list_obj.extend(list_obj) ; list_obj.extend(list_obj) s1 = list(range(4) alias = s1 s1 += 4, 5 #s1.extend(4,5) s1 += ok s10, 1, 2, 3, 4, 5, o, k s1 is
23、 aliasTrue s1 *= 3 s10, 1, 2, 3, 4, 5, o, k, 0, 1, 2, 3, 4, 5, o, k, 0, 1, 2, 3, 4, 5, o, k s1 is aliasTrue2.1.2 列表元素的增加(6)使用列表對象的insert()方法將元素添加至列表的指定位置。語法:L.insert(index, object) - insert object before indexindex必須為整數(shù),否則throw TypeError注意:insert()方法會涉及到插入位置之后所有元素的移動,這會影響處理速度。請參見書P38例子:insert與append
24、方法的性能比較(需改寫為3.x風(fēng)格:print)。列表刪除方法remove()和pop()彈出非尾部元素時,也有類似問題。建議:除非有必要,否則應(yīng)盡量避免在列表中間位置插入和刪除元素的操作,而是優(yōu)先考慮使用前面介紹的append()方法和下一小節(jié)介紹的pop()方法。 aList = 3, 4, 5, 7, 9 aList.insert(3, 6) aList3, 4, 5, 6, 7, 9 aList.insert(0, 2) # 最前面插入 aList2, 3, 4, 5, 6, 7, 9 aList.insert(len(aList), -1) # 附加 aList2, 3, 4, 5,
25、 6, 7, 9, -10-1n-1n-n-1-nn=序列長度2.1.2 列表元素的增加各種列表元素增加方法的比較#列表元素增加方法別名效果1+拼接新建列表2append附加原地修改3extend擴展原地修改4insert插入原地修改5*復(fù)制新建列表6+= 復(fù)合賦值原地修改7*=復(fù)合賦值原地重復(fù)通過切片也可以實現(xiàn)元素的增加2.1.3 列表元素的刪除(1) del命令除了直接刪除整個列表外,還可以使用del命令刪除列表中的指定位置上的元素。 a_list = 3,5,7,9,11 del a_list1 a_list3, 7, 9, 11下標越界時,拋出異常IndexError IndexErr
26、or: list assignment index out of range下標不為整數(shù)或切片對象時,拋出異常 TypeError TypeError: list indices must be integers or slices, not float根據(jù)下標刪除某個元素;根據(jù)下標刪除某個元素并返回該元素;根據(jù)值刪除第一個出現(xiàn)(即值相等)的元素0-1n-1n-n-1-nn=序列長度2.1.3 列表元素的刪除(2)使用列表的pop(index)方法刪除并返回指定(默認為最后一個,即下標為-1或者len of list -1) 位置上的元素,如果給定的索引超出了列表的范圍,即不在-len(seq
27、),len(seq)-1 則拋出異常。 a_list = list(3,5,7,9,11)# (3,5,7,9,11)為tuple a_list.pop()11 a_list3, 5, 7, 9 a_list.pop(1)5 a_list3, 7, 9 a_list.pop(3)Traceback (most recent call last): File , line 1, in a_list.pop(3)IndexError: pop index out of range0-1n-1n-n-1-nn=序列長度2.1.3 列表元素的刪除(3)使用列表對象的remove(x)方法刪除首次出現(xiàn)的
28、指定元素x,即如果列表中有元素的值與x的值相等(list_varindex = x),則刪除。 如果列表中不存在要刪除的元素,則拋出異常ValueError。 a_list = 3,5,7,9,7,11 a_list.remove(7) a_list3, 5, 9, 7, 11 a=1,2,3,4,5,(6,7) a.remove(4,5) a1, 2, 3, (6, 7) a.remove(0)Traceback (most recent call last): File , line 1, in a.remove(0)ValueError: list.remove(x): x not in
29、 list2.1.3 列表元素的刪除(以后再講)在使用循環(huán)進行列表元素刪除時,需要使用正確的方法。例如大家會很自然地想到使用“循環(huán)+remove()”的方法 刪除列表中指定元素的所有重復(fù)。例如,下面的代碼成功地刪除了列表中的重復(fù)元素,執(zhí)行結(jié)果是完全正確的。 x = 1,2,1,2,1,2,1,2,1 for i in x: if i = 1: x.remove(i) x2, 2, 2, 22.1.3 列表元素的刪除(以后再講)然而,上面這段代碼的邏輯是錯誤的,盡管執(zhí)行結(jié)果是正確的。例如下面的代碼同樣試圖刪除列表中所有的“1”,代碼完全相同,僅僅是所處理的數(shù)據(jù)發(fā)生了一點變化,然而當(dāng)循環(huán)結(jié)束后卻發(fā)
30、現(xiàn)并沒有把所有的“1”都刪除,只是刪除了一部分。 x = 1,2,1,2,1,1,1 for i in x: if i = 1:x.remove(i) x2, 2, 1為什么?列表 x 會隨著元素被刪除而變化,所以,每輪循環(huán)處理的 x 可能是不一樣的。每當(dāng)插入或刪除一個元素之后,該元素位置后面所有元素的索引就都改變了。怎么辦? 優(yōu)先第一種在循環(huán)的判斷條件部分,使用新的列表(如列表的切片)替代原始列表,這樣即使原始列表因元素刪除或增加而變化,作為循環(huán)判斷的新列表不會變化。使用正確的順序,例如從后往前依次判斷。2.1.3 列表元素的刪除(以后再講)正確的代碼: x = 1,2,1,2,1,1,1
31、for i in x:if i = 1:x.remove(i)或者: x = 1,2,1,2,1,1,1 for i in range(len(x)-1,-1,-1):if xi=1:del xi在循環(huán)的判斷條件部分,使用列表的切片替代原始列表,這樣即使原始列表因元素刪除或增加而變化,切片不會變化。使用正確的順序,例如從后往前依次判斷。列表推導(dǎo)式: x = i for i in x if i !=1 2.1.3 列表元素的刪除(4) 使用列表的clear()方法,刪除列表對象的所有元素,即變?yōu)榭樟斜?s = 1,2,3 s.clear() s方法作用備注del list_objindex刪除指
32、定位置元素IndexError,TypeErrorpop(index)刪除指定位置元素并返回該元素IndexError,TypeErrorremove(value)刪除首次出現(xiàn)的指定元素,返回NoneValueErrorclear()刪除所有元素空列表2.1.4 列表元素訪問與計數(shù)(1)使用下標直接訪問列表元素 aList = 3, 4, 5, 6, 7, 9, 11, 13, 15, 17 aList36 aList3 = 5.5 aList3, 4, 5, 5.5, 7, 9, 11, 13, 15, 17如果指定下標不存在,則拋出異常 aList15Traceback (most rec
33、ent call last): File , line 1, in aList15IndexError: list index out of range0-1n-1n-n-1-nn=序列長度2.1.4 列表元素訪問與計數(shù)(2)使用列表對象的index方法獲取指定值首次出現(xiàn)的下標語法:L.index(value, start, stop) - integer - return first index of value. 從start開始到stop(不包括)結(jié)束,缺省為列表第一個元素,到最后一個元素(包括)結(jié)束 Raises ValueError if the value is not prese
34、nt. aList3, 4, 5, 5.5, 7, 9, 11, 13, 15, 17 aList.index(7)4若列表對象中不存在指定值,則拋出異常 aList.index(100)Traceback (most recent call last): File , line 1, in aList.index(100)ValueError: 100 is not in list0-1n-1n-n-1-nn=序列長度2.1.4 列表元素訪問與計數(shù)(3) 使用列表對象的count方法統(tǒng)計指定元素在列表對象中出現(xiàn)的次數(shù),不會拋出異常 aList3, 4, 5, 5.5, 7, 9, 11, 1
35、3, 15, 17 aList.count(7)1 aList.count(0)0 aList.count(8)02.1.5 成員資格判斷判斷列表中是否存在指定的值(1)可以使用前面介紹的count()方法,如果存在則返回大于0的數(shù),如果返回0則表示不存在。(2)關(guān)鍵字 in value in obj 判斷一個值是否存在于列表中(即列表中是否有元素 = value ),返回“True”或“False”value not in obj: 如果value不出現(xiàn)在列表中,返回True,否則返回False 關(guān)鍵字in也可用于其他可迭代對象,包括元組、字典、range對象、字符串、集合等。循環(huán)中使用關(guān)鍵
36、字in對可迭代對象的元素進行遍歷。 for obj in iterable: aList3, 4, 5, 5.5, 7, 9, 11, 13, 15, 17 3 in aListTrue 18 in aListFalse bList = 1, 2, 3 3 in bListFalse 3 not in bListTrue 3 in bListTrue2.1.6 切片(slice)操作前面介紹過通過整數(shù)下標來訪問列表中的某個元素可以通過切片下標來訪問列表中的一個或者多個元素切片是Python序列的重要操作之一,適用于列表、元組、字符串、range對象等類型??墒褂们衅瑏斫厝×斜碇械娜魏尾糠?,得到
37、一個新列表(該列表是原列表中某些元素的淺拷貝,即指向那些元素),也可通過切片來修改和刪除列表中部分元素,甚至可以通過切片操作為列表對象增加元素切片(slice)格式: start:stop 從start開始到stop為止(不包括)的元素start:stop:step: 指定步長,而不是缺省的連續(xù)元素 2.1.6 切片(slice)操作:如何使用切片下標為整數(shù)時,list_objindex出現(xiàn)在表達式中,表示訪問對應(yīng)位置的列表元素list_objindex出現(xiàn)在賦值語句的左邊(LHS) 表示列表對象對應(yīng)位置的元素為右邊表達式計算后產(chǎn)生的對象del list_objindex表示刪除列表中inde
38、x對應(yīng)位置的元素下標為切片時與下標為整數(shù)一樣,只是: list_objslice出現(xiàn)在表達式中,表示訪問多個列表元素,截取列表中的那些指定的元素,得到一個新列表。list_objslice出現(xiàn)在賦值語句左邊,或者在關(guān)鍵字del之后,表示對多個列表元素進行操作(修改或者刪除)與使用下標訪問列表元素的方法不同,切片操作不會因為下標越界而拋出異常,而是簡單地在列表尾部截斷或者返回一個空列表,即下標超出范圍時,僅返回能遍歷到的元素,代碼具有更強的健壯性。2.1.6 切片(slice)操作: 基本切片sstart:stop : 原列表s中那些下標(index)在start,stop)的元素序列(可0個)
39、 start缺省為0,而stop缺省為列表結(jié)束即n=len(s)start和stop都可以省略,如果省略,表示采用缺省值startstop (下標意義上的比較, 不是簡單的大小比較)才可訪問到相應(yīng)元素,否則所指的元素序列為空合法的下標范圍為 -len(s), len(s) 如果stop超過len(s),則相當(dāng)于len(s)如果start a = 3, 4, 5, 6, 7, 9, 11, 13, 15, 17 a :3, 4, 5, 6, 7, 9, 11, 13, 15, 17 a3:6 # a3:6:16, 7, 9 a:33, 4, 5 a3:6, 7, 9, 11, 13, 15, 1
40、7 a 0:1003, 4, 5, 6, 7, 9, 11, 13, 15, 17 a100: a 1:-14, 5, 6, 7, 9, 11, 13, 152.1.6 切片(slice)操作: 擴展切片sstart:stop:step: step可以省略,表示缺省為1。列表中從start開始,每隔step的元素,直到stop(不包括)為止。step可以為負值,表示列表中從start開始,從后面往前相隔對應(yīng)step間隔的元素,直到stop (不包括)為止切片的index下標超出范圍時,會截取到合適的下標0-1n-1n-n-1-nn=序列長度 a = 3, 4, 5, 6, 7, 9, 11,
41、13, 15, 17 a :23, 5, 7, 11, 15 a1:24, 6, 9, 13, 17 aList:-1 # 倒序 17, 15, 13, 11, 9, 7, 6, 5, 4, 3如果step0,則start缺省為列表開頭(start=0),stop缺省為列表長度或者最后一個元素再后一個位置(stop=len(s) 如果step aList = 3, 5, 7 bList = aList: # bList = aList: aList = bListTrue aList is bListFalse bList1 = 8 bList3, 8, 7 aList3, 5, 7什么是淺拷
42、貝?僅僅copy了原有列表對象中各個元素的引用,即新列表和原列表相同位置的元素都指向同一個對象。list_a = 1,2,4,5 list_b = list_a:list_a20 = 5print(list_b) #output 1,2,5,5拷貝 制造完整的副本a = 1,2,3,4,5,6b = a.copy()42a01012123456012b01012012淺拷貝 只拷貝一層# 修改列表b的元素影響了列表a# 修改列表a的元素影響了列表ba01012123456012b01432.1.6 切片操作功能2:可以使用切片來原地修改列表內(nèi)容:添加多個新元素 aList = 3, 5, 7
43、aListlen(aList): aListlen(aList): = 9,10 # 相當(dāng)于extend(9,10) aList3, 5, 7, 9,10 aList:0 = -1,1 # 在前面添加元素 aList-1, 1, 3, 5, 7, 9, 10 aList3:3 = 500 # index=3處添加元素 aList-1, 1, 3, 500, 5, 7, 9, 10切片下標對應(yīng)的元素如果為空,給列表的切片下標賦值list_varslice時相當(dāng)于在指定位置(start或者stop所指位置)添加新元素,步長必須為1賦值語句右邊為iterable對象,即在對應(yīng)位置處插入iterabl
44、e對象中的各個元素可以在尾部添加多個元素,下標為len(list_obj):可以在前面添加多個元素,下標為0:0可以在中間(位置i)添加多個元素,下標為i:i0-1n-1n-n-1-nn=序列長度2.1.6 切片操作 aList = list(range(10) aList0, 1, 2, 3, 4, 5, 6, 7, 8, 9 aList:2 = 0*(len(aList)/2) # 步長不為1時要求左右兩邊的元素個數(shù)一樣 aList0, 1, 0, 3, 0, 5, 0, 7, 0, 9 aList = 3, 5, 7, 9, 10 aList:3 = 1, 2, 3,4 # 前面3個元素
45、替換為右邊的可迭代對象中的各個元素,后面的元素相應(yīng)移位。 aList1, 2, 3, 4, 9, 10 aList:3 = # 相當(dāng)于刪除前面3個元素 aList4, 9, 10切片下標對應(yīng)的元素如果不為空,給列表的切片下標賦值list_varslice時相當(dāng)于將下標指定位置的元素替換為賦值語句右邊iterable對象中的各個元素右邊為空列表時相當(dāng)于刪除對應(yīng)的元素功能3:可以使用切片來原地修改列表內(nèi)容: 替換或者刪除多個元素*步長不為1時要求左右兩邊的元素個數(shù)一樣2.1.6 切片操作功能4:使用del與切片結(jié)合來刪除列表元素 aList = 3,5,7,9,11 del aList:3 # 相
46、當(dāng)于 aList:3 = aList9, 11采用賦值語句來給切片賦值(包括右邊為空列表來刪除元素時)時,步長不為1時要求左右兩邊的元素個數(shù)一樣。del +切片則沒有上述限制 list1 = list(range(10) list10, 1, 2, 3, 4, 5, 6, 7, 8, 9 list1:2 = 1* (len(list1)/2) list11, 1, 1, 3, 1, 5, 1, 7, 1, 9 list1:2 = Traceback (most recent call last): File , line 1, in list1:2 = ValueError: attempt
47、to assign sequence of size 0 to extended slice of size 5 del list1:2 list11, 3, 5, 7, 9random模塊import randomr=random.randint(0, 25)print(The character is,chr(r+ord(a) # 隨機小寫英文字母import stringprint(The character is,random.choice(string.ascii_lowercase) # 隨機小寫英文字母print(random.sample(range(1,100),4) #1到
48、100之間隨機4個不同的整數(shù)aList = list(range(20)random.shuffle(aList)print(aList)函數(shù)含義random() 返回在0,1區(qū)間的隨機實數(shù)uniform(a,b)返回在a,b區(qū)間的隨機實數(shù)randint(a,b)返回在a,b區(qū)間的隨機整數(shù)choice(seq)返回序列seq中的隨機一個元素 sample(seq,n)從 序列seq中隨機選擇 n個不同的元素 shuffle(list_obj)原地隨機排序列表list_objThe character is tThe character is l23, 89, 82, 9419, 7, 17,
49、8, 18, 4, 0, 11, 2, 5, 3, 16, 10, 13, 6, 9, 1, 14, 12, 152.1.7 列表排序(1) 使用列表對象的sort方法進行原地排序,支持多種不同的排序方法。 help(.sort)L.sort(key=None, reverse=False) - None, 默認基于元素間的大小關(guān)系,升序排列reverse缺省為False,表示升序,reverse=True時為降序排列缺省基于基于元素間的大小關(guān)系,通過給key傳遞一個函數(shù),表示確定元素item的先后順序是基于調(diào)用函數(shù)key(item)的大小來判斷的基于其對應(yīng)的字符串長度升序排列,但是長度一致時
50、保證排序也是穩(wěn)定的,即按照列表中的現(xiàn)有順序排序 aList = 3, 4, 5, 6, 7, 9, 11, 13, 15, 17 import random random.shuffle(aList) aList3, 4, 15, 11, 9, 17, 13, 6, 7, 5 aList.sort()#默認為升序排列 aList.sort(reverse = True) #降序排列 aList17, 15, 13, 11, 9, 7, 6, 5, 4, 3import random s = list(range(23)random.shuffle(s)ss = s.copy()def weig
51、ht(item): return len(str(item)s.sort(key=weight)print(s)ss.sort(key = lambda item: len(str(item)print(ss)9, 2, 8, 3, 1, 4, 0, 5, 6, 7, 22, 13, 11, 18, 12, 17, 10, 14, 19, 15, 20, 16, 21lambda表達式返回一個匿名函數(shù)對象: lambda arguments: expr 等價于定義了一個匿名的函數(shù)對象,并且返回該函數(shù)對象 def _anonymous_function_(arguments): return expr 不需要額外的取名煩惱(可能重復(fù)) 函數(shù)體僅僅包含一個表達式(但是可以是包括函數(shù)調(diào)用在內(nèi)的各種表達式)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年采購合同:電子產(chǎn)品批量采購及技術(shù)支持
- 2024版特種物品運輸協(xié)議3篇
- 2024年版企業(yè)租車服務(wù)協(xié)議規(guī)范化文件版B版
- 2024慶陽房屋租賃及租后維護服務(wù)合同3篇
- 2024年私募股權(quán)投資基金投融資合作協(xié)議3篇
- 2024年美甲行業(yè)勞動合同樣本
- 2024年度藝術(shù)品寄賣代理委托協(xié)議(含投資咨詢)3篇
- 2024年版建筑總承包協(xié)議解除條款明細一
- 2024年綿陽地區(qū)標準房屋租賃協(xié)議格式版B版
- 2025年度智能家居產(chǎn)品形象拍攝合作協(xié)議3篇
- 常見酸和堿說課課件
- 2023-2024學(xué)年湖北省利川市小學(xué)語文六年級期末通關(guān)測試題詳細參考答案解析
- 礦大畢業(yè)設(shè)計-固定式帶式輸送機設(shè)計
- 高考地理一輪復(fù)習(xí)課件+湖泊的水文特征
- 熱動復(fù)習(xí)題材料熱力學(xué)與動力學(xué)
- GB/T 19405.1-2003表面安裝技術(shù)第1部分:表面安裝元器件(SMDS)規(guī)范的標準方法
- GB/T 13275-1991一般用途離心通風(fēng)機技術(shù)條件
- 彈塑性力學(xué)(浙江大學(xué)課件)
- 千年菩提路解說詞
- 濰柴天然氣發(fā)動機維修手冊
- 配氣機構(gòu)的設(shè)計
評論
0/150
提交評論