七、Python第七课——有关列表的二三事(切片、切片的遍历和复制)
目錄
一、切片?
二、遍歷切片
三、列表的復制
一、切片?
? ? ? ?此前,我們學習了如何訪問單個列表以及如何處理列表中的所有元素,那么我們如何處理列表中的部分元素呢?這就引出一個概念“切片”?。我們可以把列表看成是面包,“切片”就是要找出你最鐘意的那部分進行處理(吃掉)。如此一來,這最鐘意的部分一定有起點和終點。而且需要注意的是選擇“切片”的全程是你告訴計算機這個傻瓜的,所以你需要指明“起點”和“終點”的下標。我讀的這本書中,將下標寫作為“索引”。說下標是為了和C語言做對比。
“切片”的語法規則:
#made by Jeffery #10.19 players=['charles','martina','michael','florence','eli','jeffery'] #先構建一個運動員列表 print(players[1:5]) #print函數中的“players[1:5]”即是切片,表示輸出列表中第2個元素到第5個元素? ? ? ?這里舉例,如果你想把列表中第2個元素到第5個元素組成的部分切出來,那么你的下標就應該是1——5,我們用一段代碼舉例說明:
#made by Jeffery #10.19 players=['charles','martina','michael','florence','eli','jeffery'] #構建一個運動員列表 print(players[1:5]) #輸出列表中第2個元素到第5個元素? ? ? ?通過上面這個例子,我們應該再次清醒的認識到,機器語言中是從“0”開始的?!而我們計數第幾個是從“1”開始的,所以第2個元素(人)對應的下標應該就是“1”(機器),第5個元素(人)對應的下表應該就是“4”(機器),但為啥在代碼中是“5”呢?這是因為切片的終點和range()函數的末尾參數一樣:都是到我們指定的終點下標的前一位停止的。我們指明切片的起點和終點后,就可以取出列表中的任一片段進行分析了。
? ? ? ?假如我們沒有指明切片起點、終點中的任意一點,將會發生什么?(沒有指明指的是沒有數字,而不是“0”切記)?
#made by Jeffery #10.19 players=['charles','martina','michael','florence','eli','jeffery'] #先構建一個運動員列表 print("未指明起點的切片結果:") print(players[:5]) #未指明起點 print("未指明終點的切片結果:") print(players[1:]) #未指明終點?
從實驗結果得出:切片->未指明起點,從列表起點“起”;未指明終點,至列表終點“終”。
?有人問,那要是切片的兩個點(終點、起點)都沒指明,那將會出現什么結果?起點沒有,終點沒有,那就是整個列表了,這種情況我也在下面的文章也有提到。除了上述介紹的三種切片的方法(1、有起點、終點;2、無起點、有終點;3、有起點、無終點),還有另外一種方法,就是之前學的“負數索引”,例如:
#made by Jeffery #10.19 players=['charles','martina','michael','florence','eli','jeffery'] #先構建一個運動員列表 print(players[-3:]) #切出列表后三個元素上述代碼中使用“-3”下標成功切出列表后三個元素的切片!這一方法使得無論列表多長,我們都可以直接切出從“特定位置”開始,到列表末尾的切片。舉一反三,如果我們的終點下標用負數,例如“-3”,就是切除列表頭前3個元素的切片。切片說到這里還有一個注意的地方就是:要用“:”(冒號)分割起點和終點下標。
二、遍歷切片
“遍歷”就是都走一遍,都經歷一遍,。那么,我們既然前面學了切片,那就直接用循環對切片進行遍歷即可,這里有兩種方法:
1、 先切片,后遍歷。
#made by Jeffery #10.19 players=['charles','martina','michael','florence','eli','jeffery'] #先構建一個運動員列表 players_2=players[0:3] #切出一個列表 for player in players_2: #對剛切出的列表進行循環、遍歷print(player) #遍歷的同時輸出?
2、切片與遍歷“同時進行”
#made by Jeffery #10.19 players=['charles','martina','michael','florence','eli','jeffery'] #先構建一個運動員列表 for player in players[0:3]: #直接指明切片的起點和終點,并進行輸出。print(player)?這兩種方法我覺得在結果上沒什么區別,前者多使用了變量,后者是書中給出的標準用法。切片有以下幾種使用情形:可以使用切片對數據進行批量處理;編寫Web應用程序時可以使用切片來分頁顯示信息。
三、列表的復制
? ? ? 列表的復制就是創建一個包含整個列表的切片,即不規定切片的起點和終點,有的同學就提問了,我不能直接把a列表賦值給b列表嗎?我們接下來會用實際代碼舉例說明。
1、列表的復制
#made by Jeffery #10.19 players=['charles','martina','michael','florence','eli','jeffery'] #先構建一個運動員列表 players_1=players[:] print("原列表為:",players) print("復制形成的列表為:",players_1)?
從控制臺的顯示結果可以看出,我們確實通過切片復制、創建了一個新的列表,但這會不會就是同一個列表?(內存存儲地址一致,只是分開顯示了兩次)?我們通過接下來的代碼對其進行測試,看這兩個列表在內存中是不是分開存儲的?我們分別向這倆列表追加兩個不同的元素,看其結果。
#made by Jeffery #10.19 players=['charles','martina','michael','florence','eli','jeffery'] #先構建一個運動員列表 players_1=players[:] players_1.append("jack") #分別向這兩個列表追加不同的元素(人名)再看結果 players.append("black") print("原列表為:",players) print("復制形成的列表為:",players_1)實驗證明,我們確實通過切片形成了一個新的列表:列表中的最后一個元素正如我們分別追加的兩個元素,沒有同時出現。
那么,我們現在來驗證那位同學的猜想,是否可以通過直接賦值的方式來達到復制例表的目的?
#made by Jeffery #10.19 players=['charles','martina','michael','florence','eli','jeffery'] #先構建一個運動員列表 players_1=players print("原列表為:",players) print("復制形成的列表為:",players_1)目前看一切正常,那么我們使用同樣的方法:向這兩個列表追加兩個不同的元素。
#made by Jeffery #10.19 players=['charles','martina','michael','florence','eli','jeffery'] #先構建一個運動員列表 players_1=players players.append("jack") #向這兩個列表分別追加不同的元素 players_1.append("black") print("原列表為:",players) print("復制形成的列表為:",players_1)?
結果顯而易見,兩個列表中同時出現了追加的兩個元素,這就表明不能通過簡單的“賦值”達到復制列表的效果!?
這么做行不通的解釋是:單純“賦值”,其實還是將兩個列表的內容關聯到一起,因此這兩個列表其實指向的還是同一個列表,所以才出現了兩個列表在追加兩個不同元素后,兩個不同元素同時出現在兩個列表里的結果。所以,在使用列表的副本時,還是老老實實的去“切片”。(這里的操作結果,不同于C語言,注意區別。)?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的七、Python第七课——有关列表的二三事(切片、切片的遍历和复制)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 年化率36%是多少
- 下一篇: 关于SQL2012里,出现“表中的数据受