2016-07-28 26 views
3

我試圖用字符串中的空格替換標點符號。我搜索了答案,並在我的Python 2.7中試用了它們,它們顯示出不同的結果。使用translate來代替標點符號,這三種方式有什麼區別?

s1=" merry's home, see a sign 'the-shop $on sale$ **go go!'" #sample string 

print s1.translate(string.maketrans("",""), string.punctuation) #way1 

print s1.translate(None,string.punctuation)      #way2 

table=string.maketrans(string.punctuation,' '*len(string.punctuation)) 
print s1.translate(table)          #way3 

它打印這樣的:

merrys home see a sign theshop on sale go go 
merrys home see a sign theshop on sale go go 
merry s home see a sign the shop on sale go go 

有啥這些方式之間的區別?

回答

2

確實沒有前兩個功能差......你要麼傳遞一個空轉換表(string.maketrans("","")),或者你告訴蟒蛇跳過轉換步驟(None)。翻譯後,您將刪除所有標點符號,因爲您將string.punctionat作爲應刪除的字符。如果我是一個賭博的人,我會打賭,None版本,會有些更好的性能,但是你可以timeit,找出...

最後一個例子創建了一個轉換表中的所有標點符號映射到一個空間,不會刪除任何東西。這就是爲什麼最後一個例子中有一堆額外的空格。

+0

謝謝,現在我知道了區別。 –

1

translate的說明文件str.translate(table[, deletechars])

返回其中可選參數deletechars發生的所有字符被刪除的字符串的副本,而剩餘的字符已經通過給定的翻譯映射

設置表的參數None的翻譯THA T單獨刪除字符

print s1.translate(string.maketrans("",""), string.punctuation) 

在這種情況下,您刪除所有標點符號和空字符串

print s1.translate(None,string.punctuation) 

在這種情況下,你只是刪除所有標點符號替換空字符串。

table=string.maketrans(string.punctuation,' '*len(string.punctuation)) 
print s1.translate(table) 

在這種情況下,您將創建一個用空格替換標點符號然後轉換的轉換表。

第一和第二之間的區別,如mgilson指出,在性能上,None情況確實走快了一點:

%timeit s1.translate(string.maketrans("",""), string.punctuation) #way1 
The slowest run took 4.70 times longer than the fastest. This could mean that an intermediate result is being cached. 
1000000 loops, best of 3: 1.27 µs per loop 

%timeit s1.translate(None, string.punctuation) #way1 
The slowest run took 11.41 times longer than the fastest. This could mean that an intermediate result is being cached. 
1000000 loops, best of 3: 627 ns per loop 

第三種是完全不同的應用翻譯的。

相關問題