Python 合并拼接字符串的方法
問題
你想將幾個(gè)小的字符串合并為一個(gè)大的字符串
解決方案
如果你想要合并的字符串是在一個(gè)序列或者 iterable 中,那么最快的方式就是使用 join() 方法。比如:
>>> parts = ['Is', 'Chicago', 'Not', 'Chicago?'] >>> ' '.join(parts) 'Is Chicago Not Chicago?' >>> ','.join(parts) 'Is,Chicago,Not,Chicago?' >>> ''.join(parts) 'IsChicagoNotChicago?' >>>
初看起來,這種語法看上去會(huì)比較怪,但是 join() 被指定為字符串的一個(gè)方法。這樣做的部分原因是你想去連接的對(duì)象可能來自各種不同的數(shù)據(jù)序列(比如列表,元組,字典,文件,集合或生成器等),如果在所有這些對(duì)象上都定義一個(gè) join() 方法明顯是冗余的。因此你只需要指定你想要的分割字符串并調(diào)用他的 join() 方法去將文本片段組合起來。
如果你僅僅只是合并少數(shù)幾個(gè)字符串,使用加號(hào)(+)通常已經(jīng)足夠了:
>>> a = 'Is Chicago' >>> b = 'Not Chicago?' >>> a + ' ' + b 'Is Chicago Not Chicago?' >>>
加號(hào)(+)操作符在作為一些復(fù)雜字符串格式化的替代方案的時(shí)候通常也工作的很好,比如:
>>> print('{} {}'.format(a,b)) Is Chicago Not Chicago? >>> print(a + ' ' + b) Is Chicago Not Chicago? >>>
如果你想在源碼中將兩個(gè)字面字符串合并起來,你只需要簡單的將它們放到一起,不需要用加號(hào)(+)。比如:
>>> a = 'Hello' 'World' >>> a 'HelloWorld' >>>
討論
字符串合并可能看上去并不需要用一整節(jié)來討論。但是不應(yīng)該小看這個(gè)問題,程序員通常在字符串格式化的時(shí)候因?yàn)檫x擇不當(dāng)而給應(yīng)用程序帶來嚴(yán)重性能損失。
最重要的需要引起注意的是,當(dāng)我們使用加號(hào)(+)操作符去連接大量的字符串的時(shí)候是非常低效率的,因?yàn)榧犹?hào)連接會(huì)引起內(nèi)存復(fù)制以及垃圾回收操作。特別的,你永遠(yuǎn)都不應(yīng)像下面這樣寫字符串連接代碼:
s = '' for p in parts: s += p
這種寫法會(huì)比使用 join() 方法運(yùn)行的要慢一些,因?yàn)槊恳淮螆?zhí)行+=操作的時(shí)候會(huì)創(chuàng)建一個(gè)新的字符串對(duì)象。你最好是先收集所有的字符串片段然后再將它們連接起來。
一個(gè)相對(duì)比較聰明的技巧是利用生成器表達(dá)式(參考1.19小節(jié))轉(zhuǎn)換數(shù)據(jù)為字符串的同時(shí)合并字符串,比如:
>>> data = ['ACME', 50, 91.1] >>> ','.join(str(d) for d in data) 'ACME,50,91.1' >>>
同樣還得注意不必要的字符串連接操作。有時(shí)候程序員在沒有必要做連接操作的時(shí)候仍然多此一舉。比如在打印的時(shí)候:
print(a + ':' + b + ':' + c) # Ugly print(':'.join([a, b, c])) # Still ugly print(a, b, c, sep=':') # Better
當(dāng)混合使用I/O操作和字符串連接操作的時(shí)候,有時(shí)候需要仔細(xì)研究你的程序。比如,考慮下面的兩端代碼片段:
# Version 1 (string concatenation) f.write(chunk1 + chunk2) # Version 2 (separate I/O operations) f.write(chunk1) f.write(chunk2)
如果兩個(gè)字符串很小,那么第一個(gè)版本性能會(huì)更好些,因?yàn)镮/O系統(tǒng)調(diào)用天生就慢。另外一方面,如果兩個(gè)字符串很大,那么第二個(gè)版本可能會(huì)更加高效,因?yàn)樗苊饬藙?chuàng)建一個(gè)很大的臨時(shí)結(jié)果并且要復(fù)制大量的內(nèi)存塊數(shù)據(jù)。還是那句話,有時(shí)候是需要根據(jù)你的應(yīng)用程序特點(diǎn)來決定應(yīng)該使用哪種方案。
最后談一下,如果你準(zhǔn)備編寫構(gòu)建大量小字符串的輸出代碼,你最好考慮下使用生成器函數(shù),利用yield語句產(chǎn)生輸出片段。比如:
def sample(): yield 'Is' yield 'Chicago' yield 'Not' yield 'Chicago?'
這種方法一個(gè)有趣的方面是它并沒有對(duì)輸出片段到底要怎樣組織做出假設(shè)。例如,你可以簡單的使用 join() 方法將這些片段合并起來:
text = ''.join(sample())
或者你也可以將字符串片段重定向到I/O:
for part in sample(): f.write(part)
再或者你還可以寫出一些結(jié)合I/O操作的混合方案:
def combine(source, maxsize): parts = [] size = 0 for part in source: parts.append(part) size += len(part) if size > maxsize: yield ''.join(parts) parts = [] size = 0 yield ''.join(parts) # 結(jié)合文件操作 with open('filename', 'w') as f: for part in combine(sample(), 32768): f.write(part)
這里的關(guān)鍵點(diǎn)在于原始的生成器函數(shù)并不需要知道使用細(xì)節(jié),它只負(fù)責(zé)生成字符串片段就行了。
以上就是Python 合并拼接字符串的方法的詳細(xì)內(nèi)容,更多關(guān)于Python 合并拼接字符串的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
教你用Python寫一個(gè)京東自動(dòng)下單搶購腳本
很多朋友都有網(wǎng)購搶購限量商品的經(jīng)歷,有時(shí)候蹲點(diǎn)搶怎么也搶不到,今天小編帶你們學(xué)習(xí)怎么用Python寫一個(gè)京東自動(dòng)下單搶購腳本,以后再也不用拼手速拼網(wǎng)速啦,快來一起看看吧2023-03-03Python訪問PostgreSQL數(shù)據(jù)庫詳細(xì)操作
postgresql是常用的關(guān)系型數(shù)據(jù)庫,并且postgresql目前還保持著全部開源的狀態(tài),這篇文章主要給大家介紹了關(guān)于Python訪問PostgreSQL數(shù)據(jù)庫的相關(guān)資料,需要的朋友可以參考下2023-11-11Python實(shí)現(xiàn)自動(dòng)清理電腦垃圾文件詳解
經(jīng)常存在在我們的電腦中的垃圾文件主要是指系統(tǒng)在運(yùn)行過程中產(chǎn)生的tmp臨時(shí)文件、日志文件、臨時(shí)備份文件等。本文將利用Python實(shí)現(xiàn)自動(dòng)清理這些垃圾文件,需要的可以參考一下2022-03-03局域網(wǎng)內(nèi)python socket實(shí)現(xiàn)windows與linux間的消息傳送
這篇文章主要介紹了局域網(wǎng)內(nèi)python socket實(shí)現(xiàn)windows與linux間的消息傳送的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04django+echart數(shù)據(jù)動(dòng)態(tài)顯示的例子
今天小編就為大家分享一篇django+echart數(shù)據(jù)動(dòng)態(tài)顯示的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08