Python列表的切片操作與元素訪問詳解

得到Python的各種序列後,接下里就要知曉如何訪問或取出序列中的數據。

看似很簡單,其實門道很多,而且隨着所學的序列越來越多後,比如字符串、列表、元組、字典、一維數組、多維數組、Series、DataFrame,漸漸的腦子就會混亂,所以打算梳理一下。方便之後自己查找。

其他序列可以參看鄙人的其他博文。

目錄

1. 列表的切片操作

1.1 切片的概念

1.2 切片用法示例

 1.3 切片健壯性的體現

 1.4 利用切片實現其他操作:增加、修改、刪除

 1.5 複製與淺複製

2. 一維列表元素的訪問

3. 嵌套列表(多維列表)的元素訪問


1. 列表的切片操作

列表的單個取值和切片操作和字符串一致。

藉此迴歸一下Python列表的切片操作:關於切片操作這部分的描述,此處參照了董付國老師的《Python程序設計基礎》一書。

1.1 切片的概念

切片是Python序列的重要操作之一,適用於列表、元組、字符串、range對象等類型。切片使用2個冒號分隔的3個數字來完成:第一個數字表示切片的開始位置,默認爲0,第二個數字表是切片的截止(但不包含)位置(默認爲列表長度),第三個數字表示切片的步長(默認爲1),當步長省略時,順便可以省略最後一個冒號。

可以使用切片來截取列表中的任何部分,得到一個新列表,也可以通過切片來修改和刪除列表中部分元素,甚至可以通過切片操作爲列表對象增加元素。與使用下標訪問列表元素不同,切片操作不會因爲下標越界而拋出異常,而是簡單地在列表尾部截斷或者返回一個空列表,代碼具有更強的健壯性。

1.2 切片用法示例

aList=[3,4,5,6,7,9,11,13,15,17]
print(aList[::])  #[3, 4, 5, 6, 7, 9, 11, 13, 15, 17]
print(aList[::-1])  #[17, 15, 13, 11, 9, 7, 6, 5, 4, 3]
#加了負號,就是一個逆向輸出
print(aList[::2])  # [3, 5, 7, 11, 15]
#以步長爲2進行輸出,輸出下標依次爲0 2 4 6
print(aList[1::2])  #[4, 6, 9, 13, 17],從一開始步長爲2
print(aList[3::])  #[6, 7, 9, 11, 13, 15, 17]
print(aList[3:6])  #省略的是步長,而且不包括下標爲6的元素   #[6, 7, 9]

 1.3 切片健壯性的體現

如果用下標方式訪問,一旦索引超出範圍,就會會報錯,導致程序無法順利運行。

aList=[3,4,5,6,7,9,11,13,15,17]
print(aList[100])  #IndexError: list index out of range

 使用切片操作就不會產生該問題,會自動截斷或者返回空列表。

aList=[3,4,5,6,7,9,11,13,15,17]
print(aList[0:100:1])   #[3, 4, 5, 6, 7, 9, 11, 13, 15, 17]
#就是說,不會產生下標越界問題。
print(aList[100:])  #[]

 1.4 利用切片實現其他操作:增加、修改、刪除

可以使用切片操作來快速實現很多目的,例如,原地修改列表內容,列表元素的增刪改查以及元素替換等操作都可以通過切片來實現。並且不影響列表對象內存地址。

利用切片方法實現列表的增加

aList=[3,5,7]
print(aList[len(aList):])   #[]
#利用切片方法實現列表的增加
aList[len(aList):]=[9]  #把原來三位列表的第四位賦值爲9
print(aList)  #[3, 5, 7, 9] 

 利用切片方法實現列表元素的修改

#aList = [3,5,7,9]
aList[:3]=[1,2,3]
print(aList)  #[1, 2, 3, 9]
aList[:3]=[]
print(aList)  #[9]
aList=list(range(10))
print(aList)  #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
aList[::2]=[0]*(len(aList)//2)  #"//"整除
print(aList)  #[0, 1, 0, 3, 0, 5, 0, 7, 0, 9]

和del命令結合來刪除列表中的部分元素 

aList=[3,5,7,9,11]
del aList[:3]
print(aList)  #[9, 11]

 1.5 複製與淺複製

切片返回的是列表元素的淺複製,與列表對象的直接賦值並不一樣。

複製

複製前後的列表指向同一內存塊,擁有相同的內存地址,其中一個列表改變,另一個列表也會隨之改變。二者可以視爲同一個對象。

aList=[3,5,7]
bList=aList  #bList與aList指向同一內存塊
print(bList)  #[3, 5, 7]
bList[1]=8
print(aList,bList)  #[3, 8, 7] [3, 8, 7]  改變列表bList的值,列表aList也也被改變
print(aList==bList)  #True
print(aList is bList)  #True ,aList對象就是bList對象
print(id(aList),id(bList))  #6832776 6832776 二者擁有相同的內存地址

淺複製 

二者相等,但是二者不是同一個對象,指向的內存地址也不一樣,對一個列表做修改,也不改變另一個列表。

aList=[3,5,7]
bList=aList[::]
print(aList==bList,aList is bList) 
#輸出結果True False ,二者相等,但是二者不是同一個對象!!!
print(id(aList)==id(bList))  #False 二者的內存地址也不一樣
bList[1]=8
print(aList,bList)  
#[3, 5, 7] [3, 8, 7]  改變其中一個列表元素的值,也不影響另一個列表

2. 一維列表元素的訪問

a_list=["Duan","Yi","Xuan","Chen","Ke","Han","Jia","Le"]
print(a_list)
#['Duan', 'Yi', 'Xuan', 'Chen', 'Ke', 'Han', 'Jia', 'Le']
print(len(a_list)) #8

#從0開始計數
print(a_list[0])  #Duan
#索引是左閉右開,包括起始,不包括結尾
print(a_list[0:3])  #['Duan', 'YI', 'Xuan']
#可以指定“間隔”
print(a_list[::2])  #['Duan', 'Xuan', 'Ke', 'Jia']
#可以逆序輸出
print(a_list[::-1])  #['Le', 'Jia', 'Han', 'Ke', 'Chen', 'Xuan', 'YI', 'Duan']

3. 嵌套列表(多維列表)的元素訪問

列表裏面可以是各種數據類型,甚至是其他列表。

#嵌套列表的索性
date=[2011,2,9,9,54]
day=["sun","mon","tue","wed","thi","fri","sat"]
data=[date,day]
print(data) #[[2011, 2, 9, 9, 54], ['sun', 'mon', 'tue', 'wed', 'thi', 'fri', 'sat']]
print(data[1][3])  #wed  #第二塊的第四個

假設有這樣一個嵌套列表

a_list=[[1,2,3,4],
      [4,5,6,7],
      [7,8,9,10]]

如果將[1,2,3,4]視爲一維列表,那麼上述這個列表,可以視爲二維列表,在第一維上有三個元素,分別是[1,2,3,4],[4,5,6,7]和[7,8,9,10],在第二維上,每一維又有四個元素。那麼如果要訪問裏面的元素,就先訪問第一維,再訪問第二維,也可以只訪問第一維。

#比如說要訪問第二行的第二個元素
print(a_list[1][1]) #5
#訪問第一行
print(a_list[0]) #[1, 2, 3, 4]
#如果要訪問第二行和第三行
print(a_list[1:3])  #[[4, 5, 6, 7], [7, 8, 9, 10]]

如果要讀出每一行的中間兩個,也就是按“列”訪問,我並沒有找到像上述這種直接表示的方法(不知道別人能不能,反正我不會)。因爲print( a_list[ : : 1][ 1 : 3] )的結果是[[4, 5, 6, 7], [7, 8, 9, 10]] ,事實上a_list[ : : 1][ 1 : 3]的意思的是,[::1]先在第一維上取出所有元素:[[1, 2, 3, 4], [4, 5, 6, 7], [7, 8, 9, 10]],然後[1:3]又在裏面取出第二個和第三個,那就是[[4, 5, 6, 7], [7, 8, 9, 10]],那就只能藉助循環的方式了。

這個和後面的numpy有很大區別。

for a in a_list:
      print(a[1:3])
'''
[2, 3]
[5, 6]
[8, 9]
'''

暫時只想到這些,遇到新的再添加。如有錯誤,還請指出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章