天天看點

《Python Cookbook(第2版)中文版》——1.6 合并字元串

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

任務

有一些小的字元串,想把這些字元串合并成一個大字元串。

解決方案

要把一系列小字元串連接配接成一個大字元串,可以使用字元串操作符join。假如pieces是一個字元串清單,想把清單中所有的字元串按順序拼接成一個大字元串,可以這麼做:

如果想把存儲在一些變量中的字元串片段拼接起來,那麼使用字元串格式化操作符%會更好一些:

讨論

python中,+操作符也能夠将字元串拼接起來,進而實作類似的功能。假如有一些儲存在變量中的字元串片段,使用下面這種代碼似乎是一種很自然的方式:

類似地,如果有一個小字元串序列,假設叫做pieces,那麼很自然地,可以像這樣編寫代碼:

或者,用完全等同但卻更加漂亮和緊湊的方式:

不過,不要認為上述例子中給出的方法已經足夠好了,上面給出的方法都有許多值得推敲的地方。

python中的字元串對象是無法改變的。任何對字元串的操作,包括字元串拼接,都将産生一個新的字元串對象,而不是修改原有的對象。是以拼接n個字元串将涉及建立并丢棄n-1個中間結果。當然,不建立中間結果的操作會有更佳的性能,但往往不能一步到位地取得最終結果。

如果有少量字元串(尤其是那些綁定到變量上的)需要拼接,甚至有時還需要添加一些額外的資訊,python的字元串格式化操作符%通常是更好的選擇。性能對這種操作完全不是一個問題。和使用多個+操作符相比,%操作符還有一些其他的潛在優點。一旦習慣了它,%也會讓你的代碼的可讀性更好。也無須再對所有的非字元串(如數字)部分調用str,因為格式指定符%s已經暗中做完了這些工作。另一個優點是,還可以使用除%s之外的其他格式指定符,這樣可以實作更多的格式要求,比如将浮點數轉化為字元串的表示時,可以控制它的有效位數。

當一個序列中包含了很多的小字元串的時候,性能就變成了一個很現實的問題。在内部使用了+或者+=(和内建函數reduce作用相同,但是更漂亮)的循環所需要的時間跟需要累加的字元數的平方成正比,因為配置設定空間并填充一個大字元串所需要的時間大緻正比于該字元串的長度。幸好python提供了另一個更好的選擇。對于字元串對象s的join方法,我們可以傳入一個字元串序列作為其參數,它将傳回一個由字元串序列中所有子項字元串拼接而成的大字元串,而且這個過程中隻使用了一個s的拷貝用于串接所有的子項。舉個例子,".join(pieces)把pieces中所有的子項一口吞下,而無須産生子項之間的中間結果,再比如,', '.join(pieces)拼接了所有的子項字元串,并在鄰接的兩項之間插入了一個逗号和空格。這是一種快速、整潔、優雅且兼具良好可讀性的合并大字元串的方法。

但有時并不是所有的資料在一開始就已經就位,比如資料可能來自于輸入或計算,這時可以使用一個list作為中間資料結構來容納它們(可以使用list的append或extend方法在末尾添加新的資料)。在取得了所有的資料之後,再調用".join(thelist)就可以得到合并之後的大字元串。在我能教給你的python的字元串處理的各種技巧和方法中,這是最重要的一條:很多python程式效能低下的原因是由于它們使用了+和+=來建立大字元串。是以,一定要提醒自己永遠不要使用那種做法,而應該使用本節推薦的".join方法。