一、列表相關操作彙總
二、列表的建立
1) list() 建立
使用 list()可以將任何可迭代的資料轉化成列表。
>>> a = list() #建立乙個空的列表物件
>>> a = list(range(10))
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a = list("gaoqi,sxt")
>>> a
['g', 'a', 'o', 'q', 'i', ',', 's', 'x', 't']
2)range()建立整數列表
range()可以幫助我們非常方便的建立整數列表,這在開發中及其有用。語法格式為:
range([start,] end [,step])
start 引數:可選,表示起始數字。預設是 0
end 引數:必選,表示結尾數字。
step 引數:可選,表示步長,預設為 1
python3 中 range()返回的是乙個 range 物件,而不是列表。
我們需要通過 list()方法將其
轉換成列表物件。
典型示例如下:
>>> list(range(3,15,2))
[3, 5, 7, 9, 11, 13]
>>> list(range(15,3,-1))
[15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4]
>>> list(range(3,-10,-1))
[3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
3)推導式生成列表
由於涉及到 for 迴圈和 if 語句。
在此,僅做基本介紹。在我們控制語句後面,會詳細講解更多列表推導式的細節。
>>> a = [x*2 for x in range(5)]
#迴圈建立多個元素
>>> a
[0, 2, 4, 6, 8]
>>> a = [x*2 for x in range(100) if x%9==0]
#通過 if 過濾元素
>>> a
[0, 18, 36, 54, 72, 90, 108, 126, 144, 162,180,198]
三、列表的切片操作
我們在前面學習字串時,學習過字串的切片操作,對於列表的切片操作和字串類似。
切片是 python 序列及其重要的操作,適用於列表、元組、字串等等。切片的格式如下:
切片 slice 操作可以讓我們快速提取子列表或修改。標準格式為:
[起始偏移量 start:終止偏移量 end[:步長 step]]
注:當步長省略時順便可以省略第二個冒號
典型操作(三個量為正數的情況)如下:
其他操作(三個量為負數)的情況:
切片操作時,起始偏移量和終止偏移量不在[0,字串長度-1]這個範圍,也不會報錯。起始
偏移量小於 0 則會當做 0,終止偏移量大於「長度-1」會被當成」長度-1」。例如:
>>> [10,20,30,40][1:30]
[20, 30, 40]
我們發現正常輸出了結果,沒有報錯。
四、列表的遍歷
補充環節:
深拷貝與淺拷貝的區別
從程式的結果來看,列表a和b是賦值操作,兩個物件完全指向同乙個位址,a和b就是同一塊位址的兩個引用,其實就是乙個東西,所以乙個物件在修改淺層元素(不可變)或深層元素(可變)時,另乙個物件也同時在變;
c是a進行淺拷貝生成的物件,可以看到a(或b)和c兩個物件整體的id是不同的,但是裡面的第5個元素-列表的位址卻是相同的(指向同乙個位址),所以b在淺層次元素層面(不可變)增加乙個元素時,c並沒跟著增加,但是b的第5個元素-列表在增加乙個元素時,c的第5個元素也跟著增加了,這就是因為b和c的第5個元素-列表是指向同乙個位址的,這個位址上的值變了,在兩個地方會同時改變;
再看d,d的淺層次元素(不可變)和 深層次元素(可變)的位址和a,b,c都不一樣,所以,a,b,c無論怎麼修改,d都不會跟著改變,這就是深拷貝的結果。
也可以這樣理解:
深拷貝就是完全跟以前就沒有任何關係了,原來的物件怎麼改都不會影響當前物件
淺拷貝,原物件的list元素改變的話會改變當前物件,如果當前物件中list元素改變了,也同樣會影響原物件。
淺拷貝就是藕斷絲連
深拷貝就是離婚了
通常複製的時候要用深拷貝,因為淺拷貝後,兩個物件中不可變物件指向不同位址,相互不會改變,但是兩個物件中的可變元素是指向相同的位址,乙個變了,另乙個會同時改變,會有影響(list是可變物件)。
如果要讓原list和copy list沒有影響怎麼辦?
用深拷貝,拷貝後完全開闢新的記憶體位址來儲存之前的物件,雖然可能位址執行的內容可能相同(同乙個位址,例如』s』),但是不會相互影響。
比如:list1=[『a』,』b』,』c』]
list2=[『a』,』b』,』c』]
兩個列表中的』a』的位址是相同的
id(list1[0])=id(list2[0]),但是兩個列表的位址是不同的
通常來講不可變元素包含:
int,float,complex,long,str,unicode,tuple
五、列表的排序
修改原列表,不建新列表的排序
>>> a = [20,10,30,40]
>>> id(a)
46017416
>>> a.sort()
#預設是公升序排列
>>> a
[10, 20, 30, 40]
>>> a = [10,20,30,40]
>>> a.sort(reverse=true)
#降序排列
>>> a
[40, 30, 20, 10]
>>> import random
>>> random.shuffle(a)
#打亂順序
>>> a
[20, 40, 30, 10]
建新列表的排序
我們也可以通過內建函式 sorted()進行排序,這個方法返回新列表,不對原列表做修改。
>>> a = [20,10,30,40]
>>> id(a)
46016008
>>> a = sorted(a)
#預設公升序
>>> a
[10, 20, 30, 40]
>>> id(a)
45907848
>>> a = [20,10,30,40]
>>> id(a)
45840584
>>> b = sorted(a)北京尚學堂·百戰程式設計師
實戰 系統 好教育
>>> b
[10, 20, 30, 40]
>>> id(a)
45840584
>>> id(b)
46016072
>>> c = sorted(a,reverse=true)
#> c
[40, 30, 20, 10]
通過上面操作,我們可以看出,生成的列表物件 b 和 c 都是完全新的列表物件。
六、內建函式 reversed() 返回迭代器
內建函式 reversed()也支援進行逆序排列,與列表物件 reverse()方法不同的是,內建函式
reversed()不對原列表做任何修改,只是返回乙個逆序排列的迭代器物件。
>>> a = [20,10,30,40]
>>> c = reversed(a)
>>> c
>>> list(c)
[40, 30, 10, 20]
>>> list(c)
我們列印輸出 c 發現提示是:list_reverseiterator。也就是乙個迭代物件。同時,我們使用
list(c)進行輸出,發現只能使用一次。第一次輸出了元素,第二次為空。那是因為迭代物件
在第一次時已經遍歷結束了,第二次不能再使用。
列表相關操作
lst1 1 2 lst2 3 4 lst lst1 lst2 print lst lst1 1 2 lst lst1 3print lst 語法 列表 完整格式 開始索引 結束索引 間隔值 1 開始索引 從開始索引擷取到列表的最後 2 結束索引 從開頭擷取到結束索引之前 結束索引 1 3 開始索引...
list列表相關操作
字串的操作 s alexwusir s1 s.capitalize print s1 大寫,小寫 s2 s.upper s3 s.lower print s2,s3 s str aceq your input input 請輸入驗證碼 不區分大小寫 if s str.lower your input...
Python 數字列表相關
for aa in range 3,8 print aa 345 67 建立乙個數字列表 aa1 list range 10,20,3 10開始到20直接,每隔三個取乙個值 print aa1 10,13,16,19 pingfang for a in range 1,10 aa a 2 print...