2015-05-01 20 views
2

現在我有這樣的:將兩張。加入方法爲一個

str = " s tr & &^ 23G7/*%45afju657**(%^#%$!!fdf" 

str = ''.join(e for e in str if e.isalnum()) 
str = ''.join(('...', str, '...')) 

我可以將它們合併喜歡:

str = ''.join(('...', e for e in str if e.isalnum(), '...')) 
+2

你試過運行它嗎? –

+1

不,因爲'e for e ...'部分不是一個字符串,'join'需要。你可以這樣做:'str =''.join(('''',''.join(e for str in if e.isalnum()),'...'))' – malfunctioning

+0

@SterlingArcher ,http://ideone.com/QWJWmA – niceday

回答

4

您可以使用format

s = "...{}...".format(''.join(e for e in s if e.isalnum())) 

作爲一個側面說明,因爲它的影子了內置

除了不命名你的字符串作爲str,如果你真的真的想用join兩次,你可以把它寫成

''.join(('...', ''.join(e for e in s if e.isalnum()), '...')) 

但這不是一個好主意。爲什麼要用核彈來殺死蚊子!

+0

哦哈哈我雖然'''是他的'my_str'的​​其他部分... ...不是一個litteral' ...'+1 –

+0

@JoranBeasley它很清楚''...''; –

+0

是啊20- 20後見之明,重新閱讀我可以看到的問題:P –

3

你可以做

my_str = ''.join(['...']+ [e for e in my_str if e.isalnum()] +['...']) 
+0

太棒了!謝謝)。 – niceday

2
string = " s tr & &^ 23G7/*%45afju657**(%^#%$!!fdf" 

您可以使用filter()作爲一個理解語法糖。它適用於函數而不是方法,但是 - 將字符串方法僞裝成函數的lambda與簡單理解(謝謝,@Bhargav)相比變得更慢。

string = ''.join(['...', ''.join(filter(lambda x: x.isalnum(), string)), '...']) 

或:

​​

取決於什麼命令你喜歡​​。

+1

有趣的是,這裏使用'lambda'使得操作非常緩慢,與非lambda解決方案相比速度幾乎相同。 –

+1

@ TigerhawkT3小錯字,需要x.isalnum() –

+0

注意到λ緩慢,錯誤修正。感謝您指出這些。 – TigerhawkT3

3

爲什麼不使用+運算符?而filter也相當不錯。既然你使用Python 2.7,你甚至不需要重新加入:

>>> s = " s tr & &^ 23G7/*%45afju657**(%^#%$!!fdf" 
>>> s = '...' + filter(str.isalnum, s) + '...' 
>>> s 
'...str23G745afju657fdf...' 
+0

我喜歡在這裏使用'str.'。對於2.7中較長的字符串,使用join()而不是串聯會更快嗎? – TigerhawkT3

+0

@ TigerhawkT3而不是什麼級聯?哦,你的意思是'+'?我不這麼認爲,但我會嘗試。 –

+0

不,沒有區別。爲什麼呢? –