天天看點

第3.3節 強大的Python清單

一、 清單切片操作補充

清單切片支援所有序列切片的方法,以倒序切片和步長大于1的情況再舉例驗證一下:

第3.3節 強大的Python清單

l=[1,2,3,4,5]

l[::2] #結果[1, 3, 5]

l[-1::2] #結果[5]

l[-1::-2] #結果[5, 3, 1]

其他序列已有的切片方法在清單中同樣适用,這裡就不舉例說明了。

通過切片指派:當給切片指派為與切片個數相同的元素數量的清單時,實際上就是将切片指定的元素替換為新清單的内容。舉例:

第3.3節 強大的Python清單

c=[1,2,3,‘a1178’,‘b210’,‘c3112’]

c[2:5]=[100,200,‘abcdefg’] #執行結果為c=[1, 2, 100, 200, ‘abcdefg’, ‘c3112’]

通過切片插入給定清單中的值到原清單中指定位置,具體位置通過切片起始索引指定,此時兩個索引值應該相等

第3.3節 強大的Python清單

c[2:2]=[‘ABC’,‘123’,‘E456’] #執行完畢後, c=[1, 2, ‘ABC’, ‘123’, ‘E456’, 3, ‘a1178’, ‘b210’, ‘c3112’]

通過切片更新和同時插入元素:上面兩點講了切片元素替換和插入,如果指派語句右邊的清單長度長于切片的起始位置包含的元素個數,是否會導緻切片段的元素被替換,多餘的被插入?

第3.3節 強大的Python清單

c[2:4]=[100,200,300,400] # c =[1, 2, 100, 200, 300, 400, ‘b210’, ‘c3112’],确實是切片部分被替換,多出切片部分的新元素插入

如果清單元素個數少于切片包含的元素個數呢?我們來看實際例子:

第3.3節 強大的Python清單

c[2:5]=[100,200] #c=[1, 2, 100, 200, ‘c3112’],切片超過指派清單的部分被删除了

删除清單的元素:通過上面的例子,我們發現切片還可以删除元素,那整個清單清空也可以通過切片操作,其文法是c[:]=[],類似于clear的效果。

如果切片時帶步長不等于1又會什麼效果?具體在這裡不講解了,舉例如下:

第3.3節 強大的Python清單

c[::2]=[] #報錯,3個元素的切片不能指派為空序列

c[::2]=[‘A’,‘B’,‘C’] #正常執行,替換1、3、5三個元素,結果[‘A’, 2, ‘B’, ‘a1178’, ‘C’, ‘c3112’],很神奇吧?

c[::2]=[‘A’,‘B’,‘C’,‘D’,‘E’]#報錯,3個元素的切片不能指派為大小為5的序列

c[::2]=[‘A1’,‘B1’]#報錯,3個元素的切片不能指派為大小為2的序列

從以上試驗可以看出,隻有當用于替換的清單的元素個數與被替換的切片元素個數相等時才會允許步長不等于1切片指派操作

以上詳細介紹了清單的切片的進一步操作,還有其他的操作方法,如怎麼把extend用切片方式實作,怎麼用切片複制一個清單,大家可以自己想想和試驗一下,在此不再詳細介紹。總體來說,切片讓序列和清單很神奇很靈活,但在本階段知識下的老猿認為實際在程式開發中利用起來的場景應該不多,不知道随着進一步的學習是否有變化。

二、 清單的其他操作

序列的拼接、相乘在清單中同樣支援,舉例如下:

第3.3節 強大的Python清單

l1=l+l #執行結果 l1為[1, 2, 3, 4, 5, 1, 2, 3, 4, 5]

l2=l*3 #執行結果 l2為[1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]

in這個方法在序列中就存在,前面介紹序列時沒有介紹,在這以清單補充說明一下。

文法:元素 in 清單,傳回True或False的布爾值

第3.3節 強大的Python清單

ls = [‘abc’,‘a1’,‘b2’,‘c3’]

‘abc’ in ls #傳回結果True

字元串的使用方法類似,字典中使用有些不同,在字典章節再詳細介紹。

max、min、len在清單中同樣可以使用,但max、min要求清單的元素必須是純數字或純字元串的,不能支援數字和字元串的混合,但支援清單的元素還是清單,且每個子清單的元素都是數字或者都是字元串(多個子清單的元素類型必須相同),看看下面的例子

第3.3節 強大的Python清單

n=[1,2,3]

c=[‘a’,‘ba’,‘c1’]

max(n),max© #執行結果(3, ‘c1’)

l = n+c #執行結果[1, 2, 3, ‘a’, ‘ba’, ‘c1’]

max(l)報錯:

Traceback (most recent call last):

File “<pyshell#6>”, line 1, in

max(l)

TypeError: ‘>’ not supported between instances of ‘str’ and ‘int’

l=[n]+[n] #執行結果 l=[[1, 2, 3], [1, 2, 3]],注意清單元素還是清單

max(l) #執行結果為[1, 2, 3]

l=[c]+[c] #執行結果為 l=[[‘a’, ‘ba’, ‘c1’], [‘a’, ‘ba’, ‘c1’]]

max(l) #執行結果為[‘a’, ‘ba’, ‘c1’]

l=[n]+[c]#執行結果為l=[[1, 2, 3],[‘a’, ‘ba’, ‘c1’]]

File “<pyshell#15>”, line 1, in

count方法是清單的方法,用于計算指定元素在清單中出現的次數,該方法還可以用于字元串和元組,但不能用于字典類型;

reverse是清單方法,該方法用于将清單中的元素反序排列,并不傳回任何值,但并不表示清單中的元素是按降序排列。

l=[1,3,5,7,6]

l.reverse() #執行結果l= [6, 7, 5, 3, 1]

sort是清單方法,可以對清單元素進行排序(包括升序和降序),如果要降序排列,需要指定reverse=True,該方法并不傳回任何值。

l.sort() #執行結果l=[1, 3, 5, 6, 7]

l.sort(reverse=1) #執行結果l=[7, 6, 5, 3, 1]

sort清單方法還可以指定排序的方法,預設是按字母順序,也可以按指定處理方法處理的結果來比較,實際上就是将清單的元素通過一個函數進行hash得到的鍵值進行比較,具體函數通過參數key來指定,如指定len函數作為處理方法,則是将所有清單元素計算長度後,再按長度進行排序。如:

第3.3節 強大的Python清單

s = [‘123’,‘abc’,‘1234’,‘abcd’,‘01234’,‘ABC’]

s.sort(key=len) #執行結果s=[‘123’, ‘abc’, ‘ABC’, ‘1234’, ‘abcd’, ‘01234’]

函數sorted, 函數的參數可以是任何序列,傳回一個排序的清單,參數對應的序列沒有變化,與清單方法sort相同,可以指定reverse來确認是升序還是降序。如:

sorted(l,reverse=True)

s =‘1231234’

sorted(s) #傳回清單[‘1’, ‘1’, ‘2’, ‘2’, ‘3’, ‘3’, ‘4’],s保持不變

三、 清單的複制

清單的複制涉及内容比較多,是以單列一個段,是将一個清單變量的元素複制到一個新清單中,但兩個清單不是同一個對象。先介紹方法:

用copy方法,文法為:新清單=老清單.copy();

用切片方法,文法為:新清單=老清單[:];

用list方法,文法為:新清單=list(老清單).

注意,以上的複制方法都是淺複制,什麼是淺複制?就是複制時,隻是完全複制了第一層元素,但第一層元素如果有嵌套的對象(如清單、元組、字典等)時,其指向的下一次對象隻是複制了指向,被沒有複制内容。下面來看案例:

第3.3節 強大的Python清單

l=[‘abc’,[1,2,3]]

l1,l2,l3,l4=l,l.copy(),l[:],list(l) #執行後4個新清單值完全與l一緻,别忘了前面第三節(第二章 Python程式設計基礎知識)介紹的“一次給多個變量指派”操作方法。

l1,l2,l3,l4 #顯示4個清單内容,都是([‘abc’, [1, 2, 3]]

l is l1 #判斷兩個對象是否是一個對象,結果為True

l is l2 #結果為False

l is l3 #結果為False

l is l4 #結果為False

l[0]=‘ABCD’ #修改清單l的第一個元素值

l[1][0]=100 #修改清單第二個元素嵌套的子清單的第一個元素的值

l #經過修改後l的值變為[‘ABCD’, [100, 2, 3]]

l1,l2,l3,l4 #顯示4個清單内容,分别是([‘ABCD’, [100, 2, 3]], [‘abc’, [100, 2, 3]], [‘abc’, [100, 2, 3]], [‘abc’, [100, 2, 3]])

從上述執行結果可以看出,由于l和l1是同一對象,對l的所有指派都會反映到l1,而l2、l3、l4都是淺複制,是以對于l字元串元素的修改都不會影響到它們,但對嵌套子清單的修改會影響到這三個。

關于淺複制,有點類似于c語言的指針數組,淺複制隻是将原數組的指向位址複制了一份到新數組,但複制的數組與原數組都存儲了各個指針的指向位址,但指針指向内容發生變化時,原始數組指向和新數組指向位址沒變,但該位址存儲的内容發生了變化,新老數組都可以通路到新的内容。

有淺複制就有深度複制,具體内容後面再講。

本節繼上節之後,對清單的操作方法進一步進行了講解,清單的功能很強大,大家多練習一下。在這裡特别說明一下,老猿所說的方法都是指某類對象的操作方法,屬于對象或類所有,函數則是不屬于對象和類的通用函數。

老猿Python系列文章用于逐漸介紹老猿學習Python後總結的學習經驗,這些經驗有助于沒有接觸過Python的程式員可以很容易地進入Python的世界。