2013-07-28 124 views
-1

在Python中,我應該寫一個程序要求用戶爲一個字符串,然後它消除P,Q,R的所有匹配,S,T(下和上例),然後打印出其他所有內容。 對於輸入Today it is Tuesday它應該打印oday i i ueday卸下某些字母從字符串

我寫的代碼,但如果需要,它不會刪除最後一個字母。 這裏是我寫的東西:

S = str(input("Please enter some text: ")) 
L = list(S) 
for i in L : 
    if i in 'tsrqpPQRST' : 
     L.remove(i) 
string = "" 
for char in L : 
    string = string + char 
print(string) 

回答

1

你可以使用str.translate

>>> test = 'Today it is Tuesday' 
>>> removeText = 'pqrst' 
>>> test.translate(None, removeText+removeText.upper()) 
'oday i i ueday' 

由於您使用的是Python 3,因此請使用這樣的translate()方法。

>>> test = 'Today it is Tuesday' 
>>> removeText = 'pqrst' 
>>> test.translate(dict.fromkeys(ord(elem) for elem in removeText+removeText.upper())) 
'oday i i ueday' 

您的代碼中的問題是您在迭代時從列表中刪除東西。

只是在做這個工作。 (在這裏,你製作一個副本,遍歷它,而從原來的列表中刪除元素)

>>> testList = list(test) 
>>> for i in testList[:]: 
     if i in 'pqrstPQRST': 
      testList.remove(i) 


>>> "".join(testList) 
'oday i i ueday' 

P.S - 而不是使用string = ''並遍歷列表,並加入文字,只需用"".join(...)

0

有很多方法可以做到這一點。例如

>>> s = "helllo" 
>>> s.replace("l","") 
'heo' 
>>> s.translate(None,"le") 
'ho' 
>>> 

作爲一個側面說明,你不必把字符串轉換成一個列表來遍歷它但是當你遍歷它,你不應該修改的迭代,所以如果你想提高你的代碼這將是沿着線的東西:

>>> s 
'helllo' 
>>> m = "" 
>>> for i in s: 
     if i not in "el": #put the list of characters here 
       m += i 


>>> m 
'ho' 
>>> 

這樣,你是一個字符串的副本,你不會遇到問題,當您迭代期間修改它,你有。

1

您可以使用正則表達式:

import re 
new_string = re.sub('(?i)[pqrst]', '', S) 
+0

+1 - 正則表達式快速而輕鬆地解決了這個問題。但是,你可以做得更好:'re.sub('(?i)[p-t]','',S)'。這是有效的,因爲「pqrst」是按字母順序排列的。 – iCodez

1

您可以結合joingenerator expression。合併for循環和字符串concatation效率不高或pythonic。而且,字符串本身是可迭代的,不需要將它變成列表。

>>> s = 'Today it is Tuesday' 
>>> ''.join(x for x in s if x not in 'pqrstPQRST') 
'oday i i ueday' 
>>> 
+0

[與str.join一起使用沒有優勢](http://stackoverflow.com/a/9061024/846892),它比LC更具可讀性。 –

+0

謝謝。這讓我對這兩者有了新的認識。但是現在我應該好奇爲什麼循環中的GC更快。 – zhangyangyu

+0

[這取決於數據。](http://stackoverflow.com/a/11964301/846892),對於小/平均大小的循環LC更快。 –