天天看點

Python 循環拼接字元串_如何大規模拼接字元串?(含中獎名單)

月初公衆号上給大家送了10本書,有5本是用抽獎助手抽的,大家可以在抽獎助手上檢視。

另外5本是在贊賞區抽的,我寫了個随機函數随機從贊賞的63人中抽取的,這5個人的名單如下:

.  

微笑心情真好 

方木南土川  

李超 

念橋邊紅藥

請這5位同學稍後加我微信:build_wheels,告訴我位址和聯系方式,截止到今天晚上9點。

好了,下面進入今天的主題:如何大規模高效拼接python字元串?

稍微有python程式設計基礎的同學都會想到“+”拼接:

Python 循環拼接字元串_如何大規模拼接字元串?(含中獎名單)

實際上,字元串“+”運算符是方法__add__重載的,str1+str2即str.__add__(str1, str2):

Python 循環拼接字元串_如何大規模拼接字元串?(含中獎名單)

但是,如果需要大規模拼接字元串?使用“+”還合适嗎?

核心問題:如何将清單中的字元串合并為一個字元串?

例如:如何将[“a”,”bc”,”d”,….]拼接為一個字元串?

當然,使用“+”也是完全可行的,正常思路即可:

Python 循環拼接字元串_如何大規模拼接字元串?(含中獎名單)

此方法雖然可以得到正确的結果,但是在實際應用中這樣做是非常浪費計算資源的,在for循環中,每一次疊代得到s都是拼接過程中的一個臨時變量,s與sl拷貝給__add__後傳回得到新的s後,上一次疊代中的s就被釋放掉了,是以每一次疊代都伴随着字元串的拷貝與變量的釋放。倘若實際項目中清單規模很大,那麼這種方法就會變得很低效甚至無法使用。

核心方法:str.join()

此時,使用python提供的join方法會比較合适。我們可以看一下python對str.join方法的說明:

Python 循環拼接字元串_如何大規模拼接字元串?(含中獎名單)

使用時,通過分隔符調用join方法,傳入參數需要是一個可疊代對象,如清單,集合,字典等,傳回由分隔符連接配接的字元串。例如:

Python 循環拼接字元串_如何大規模拼接字元串?(含中獎名單)

如圖,使用‘-’調用join,将清單作為參數傳入,就可以得到字元串拼接結果。我們在程式設計中生成的任何清單,集合,字典,如若有需求都可以使用str.join方法拼接為一個字元串。

好,回到我們的問題,解決方法如下:

Python 循環拼接字元串_如何大規模拼接字元串?(含中獎名單)

如上圖,當不需要分隔符時,使用空字元串調用join方法即可。

我們可以對比一下兩種方法的時間:

首先生成一個10w長度的清單:

Python 循環拼接字元串_如何大規模拼接字元串?(含中獎名單)

(其中,第二行的意義為在10w次疊代中,生成10w個-10到10之間的随機整數,且将整數轉化為字元串,這10w個字元串構成一個清單。)

比較時間:

Python 循環拼接字元串_如何大規模拼接字元串?(含中獎名單)

如圖,join方法比‘+’快了一個數量級。可見join方法不僅更簡潔,而且更高效!

我們再補充一個應用:

倘若待拼接的清單中,不僅僅含有字元串,同時含有其他類型的資料,這是要怎麼做呢?

核心問題:如何将清單中的字元串與非字元串合并為一個字元串?

其實按照上文思路,我們可以使用join輕松解決。

Python 循環拼接字元串_如何大規模拼接字元串?(含中獎名單)

(第二行意義:對strlist進行疊代,對其每一個元素x,将x轉化為字元串,構成一個新的清單)

但是上圖第二行運作時,join函數參數中生成新清單時,基于strlist中元素的個數,append了3次,記憶體中額外生成了3個清單。倘若實際項目中strlist元素個數為10w,則運作過程中記憶體就會額外生成10w個清單,十分浪費空間!

這種場合可以使用生成器對象。

核心方法:生成器對象

Python 循環拼接字元串_如何大規模拼接字元串?(含中獎名單)

生成器與清單形式上差别就在于一個是[]括起來的,一個是()括起來的,如上圖第2行,生成器每疊代一次都會抛出一個值,而不需要額外生成新的對象,生成器方法與清單方法雖然運作時間差不多,但是前者能節省相當多的空間。

此外,生成器做參數時,是不需要()的,如下圖寫法依然合法:

Python 循環拼接字元串_如何大規模拼接字元串?(含中獎名單)

▼往期精彩回顧▼當當創始人李國慶離職我是如何在阿裡巴巴面試中壯烈犧牲的?履歷石沉大海,真相可能是這個

Python 循環拼接字元串_如何大規模拼接字元串?(含中獎名單)