月初公衆号上給大家送了10本書,有5本是用抽獎助手抽的,大家可以在抽獎助手上檢視。
另外5本是在贊賞區抽的,我寫了個随機函數随機從贊賞的63人中抽取的,這5個人的名單如下:
.
微笑心情真好
方木南土川
李超
念橋邊紅藥
請這5位同學稍後加我微信:build_wheels,告訴我位址和聯系方式,截止到今天晚上9點。
好了,下面進入今天的主題:如何大規模高效拼接python字元串?
稍微有python程式設計基礎的同學都會想到“+”拼接:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SY1ImN2ITOjZTNxMWYmVzM5YTN0MGZzgTOmVmN0gjZ58CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
實際上,字元串“+”運算符是方法__add__重載的,str1+str2即str.__add__(str1, str2):
但是,如果需要大規模拼接字元串?使用“+”還合适嗎?
核心問題:如何将清單中的字元串合并為一個字元串?
例如:如何将[“a”,”bc”,”d”,….]拼接為一個字元串?
當然,使用“+”也是完全可行的,正常思路即可:
此方法雖然可以得到正确的結果,但是在實際應用中這樣做是非常浪費計算資源的,在for循環中,每一次疊代得到s都是拼接過程中的一個臨時變量,s與sl拷貝給__add__後傳回得到新的s後,上一次疊代中的s就被釋放掉了,是以每一次疊代都伴随着字元串的拷貝與變量的釋放。倘若實際項目中清單規模很大,那麼這種方法就會變得很低效甚至無法使用。
核心方法:str.join()
此時,使用python提供的join方法會比較合适。我們可以看一下python對str.join方法的說明:
使用時,通過分隔符調用join方法,傳入參數需要是一個可疊代對象,如清單,集合,字典等,傳回由分隔符連接配接的字元串。例如:
如圖,使用‘-’調用join,将清單作為參數傳入,就可以得到字元串拼接結果。我們在程式設計中生成的任何清單,集合,字典,如若有需求都可以使用str.join方法拼接為一個字元串。
好,回到我們的問題,解決方法如下:
如上圖,當不需要分隔符時,使用空字元串調用join方法即可。
我們可以對比一下兩種方法的時間:
首先生成一個10w長度的清單:
(其中,第二行的意義為在10w次疊代中,生成10w個-10到10之間的随機整數,且将整數轉化為字元串,這10w個字元串構成一個清單。)
比較時間:
如圖,join方法比‘+’快了一個數量級。可見join方法不僅更簡潔,而且更高效!
我們再補充一個應用:
倘若待拼接的清單中,不僅僅含有字元串,同時含有其他類型的資料,這是要怎麼做呢?
核心問題:如何将清單中的字元串與非字元串合并為一個字元串?
其實按照上文思路,我們可以使用join輕松解決。
(第二行意義:對strlist進行疊代,對其每一個元素x,将x轉化為字元串,構成一個新的清單)
但是上圖第二行運作時,join函數參數中生成新清單時,基于strlist中元素的個數,append了3次,記憶體中額外生成了3個清單。倘若實際項目中strlist元素個數為10w,則運作過程中記憶體就會額外生成10w個清單,十分浪費空間!
這種場合可以使用生成器對象。
核心方法:生成器對象
生成器與清單形式上差别就在于一個是[]括起來的,一個是()括起來的,如上圖第2行,生成器每疊代一次都會抛出一個值,而不需要額外生成新的對象,生成器方法與清單方法雖然運作時間差不多,但是前者能節省相當多的空間。
此外,生成器做參數時,是不需要()的,如下圖寫法依然合法:
▼往期精彩回顧▼當當創始人李國慶離職我是如何在阿裡巴巴面試中壯烈犧牲的?履歷石沉大海,真相可能是這個