Python 列表相關操作

2022-07-07 04:36:13 字數 4360 閱讀 1416

一、列表相關操作彙總

二、列表的建立

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...