讓列表逆序排列是我們編程時常碰到的問題,比如現在有一些客戶的姓名是將拼音的首字母按 A - Z 排列的,而你現在想找一個姓張( Z )的客戶,你就有了將姓名逆序排列的需求了。而在 Python 中,將列表逆序有 3 種方式,下面將逐一討論。
當然,這裡說的 3 種方式指的是使用 Python 的內建模塊的方法,不使用第三方的方法,包括你自己可能會寫的循環等。
假設我們現在有這麼一個列表
[1, 2, 3, 4, 5]
我們最終想得到的是
[5, 4, 3, 2, 1]
怎麼辦?
第一種方式 list.reverse()
Python 的 list.reverse() 方法,會直接在原來的列表裡面將元素進行逆序排列,不需要創建新的副本用於存儲結果。
就像你看到的這樣,調用 list.reverse() 的返回值是 None ,它逆序的結果直接體現在原來的列表裡面。
這種方式,有好處也有壞處。好處是節省內存使用,因為我們不需要重新申請空間來保存最後的結果。壞處是,我們修改了原來的數據,如果我們後面要使用原數據的話不方便。(雖說再倒序一次就行,但畢竟使用了多餘的操作)。
從可讀性來說,我喜歡這種方式。這個方法從字面意思上就告訴了我們所做的操作,即使是 Python 新手不知道這個方法,也能大致清楚這個完成了什麼功能。
第二種方式 使用切片 [::-1]
Python 的列表有一個特性叫做切片,你可以將它看作是方括號( [ ] )使用的擴展。
簡單的說下切片的使用
mylist[start:end:step]
上面的操作表示取 mylist 的第 start 個(列表索引從 0 開始)到第 end 個元素(不包括第 end 個),其中每隔 step 個(默認 1 )取一個。
當然,start 、end 和 step 都是可選的。
mylist[:] 會返回 mylist 的副本
加上 step 的話也正常工作
而當 start 、end 和 step 為負時,表示從反方向遍歷,看下面的例子就理解了
所以 mylist[::-1] 就能達到逆序的目的
相比於第一種方式,這種方式會另外創建副本來保存列表的所有元素,所以需要更多的內存空間。並且,由於使用了切片的特性,導致在可讀性上也不如之前的方式。但是這種方式沒有改變原來的列表,在某些情況下算是一種優勢。
第三種方式 使用 reversed() 方法
reversed 方法會將列表逆序的結果存儲到迭代器裡面,這種方式不會改變原來的列表,也不會創建原來列表的完整副本,只會多出迭代器對象所佔的空間,相對來說也比較高效。(不明白迭代器原理的同學可以看下我之前的一篇文章 一步一步帶你理解 Python 迭代器)
如果要訪問所有的元素,循環就好,就像這樣
看了例子後,我們發現,這個的可讀性也好,畢竟 reversed 字面意思已經體現出來了。
但是,如果我們想要一個列表呢,也簡單
雖然這能達到目的,但是如果我們最終想要得到列表的話,這裡使用 reversed 方法就沒有意義了,因為這裡我們又創建了 mylist 的副本。針對這種情況,用第一種或第二種方式更合適。
那麼選擇哪一種呢
1、顯然,第一種是首選。畢竟高效、易讀。如果不要保留原列表的數據,使用這種方式顯然更有優勢,否則選擇後兩種。
2、如果最後需要得到列表類型的結果,那麼選第二種方式比較合理。否則,第三種方式更高效。