天天看點

《Python Cookbook(第2版)中文版》——1.7 将字元串逐字元或逐詞反轉

本節書摘來自異步社群《python cookbook(第2版)中文版》一書中的第1章,第1.7節,作者[美]alex martelli , anna martelli ravenscrof , david ascher ,高鐵軍 譯,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

任務

把字元串逐字元或逐詞反轉過來。

解決方案

字元串無法改變,是以,反轉一個字元串需要建立一個拷貝。最簡單的方法是使用一種“步長”為-1的特别的切片方法,這樣可立即産生一個完全反轉的效果:

如果要按照單詞來反轉字元串,我們需要先建立一個單詞的清單,将這個清單反轉,最後再用join方法将其合并,并在相鄰兩詞之間都插入一個空格:

或者,如果喜歡簡練而緊湊的“一行解決”的代碼:

如果想逐詞反轉但又同時不改變原先的空格,可以用正規表達式來分隔原字元串:

注意,最後的join操作要使用空字元串,因為空格分隔符已經被儲存在revwords清單中了(通過re.split,使用了一個帶括弧的組的正規表達式)。當然,也可以寫成“一行解決”的形式,隻要你樂意:

不過這樣顯得過于緊湊,也失去了可讀性,不是好的python代碼。

讨論

在python 2.4中,可以改寫那個“一行解決”的逐詞反轉的代碼,使用新的内建函數reversed來替代原先的可讀性略差的切片訓示符[::-1]:

至于逐字元反轉,astring[::-1]仍然是最好的方式,即使在python 2.4中,因為如果要使用reversed,還得調用".join:

新的内建函數reversed傳回一個疊代器(iterator),該對象可以被用于循環或者傳遞給其他的“累加器”,比如".join,但它并不是一個已經完成的字元串。