2013-10-18 42 views
0

我有一個標點符號列表,我希望循環從用戶輸入的句子中刪除,它似乎忽略了連續的多個標點符號?循環刪除列表中的字符不起作用

punctuation = ['(', ')', '?', ':', ';', ',', '.', '!', '/', '"', "'"] 
usr_str=input('Type in a line of text: ') 

#Convert to list 
usr_list= list(usr_str) 

#Checks if each item in list is punctuation, and removes ones that are 
for char in usr_list: 
    if char in punctuation: 
     usr_list.remove(char) 

#Prints resulting string 
print(''.join(usr_list)) 

現在,這適用於:

This is an example string, which works fine! 

它打印:

This is an example string which works fine 

然而,這樣的事情:

Testing!!!!,) 

給出:

Testing!! 

在此先感謝您的幫助!

+0

的問題是,迭代器沒有被移回檢查取一個去除的地方性格。但是,您確實應該使用更清晰的方法,例如RegEx。 –

+0

好的斯賓塞是有道理的,我在Python中是合理的新手,所以我會做一些研究正則表達式。謝謝! – Stensby

+0

如果你不想進入RegEx,我還會推薦@Sonon的'string.translate'的答案。 –

回答

2

您正在更改清單而您正在迭代它。從來不是一個好主意。

一種方式得到它的工作就是遍歷列表的副本:

for char in usr_list[:]: # this is the only part that changed; add [:] to make a copy 
    if char in punctuation: 
     usr_list.remove(char) 

有了更多的經驗,你可能會使用「列表理解」來代替:

usr_list = [char for char in usr_list if char not in punctuation] 

您可能會使用filter()或正則表達式或...獲得其他答案。但首先要保持簡單:-)

另一種方法是製作兩個不同的列表。假設你的輸入列表是input_list。然後:

no_punc = [] 
for char in usr_list: 
    if char not in punctuation: 
     no_punc.append(char) 

,並注意到有真的沒有必要以這種方式既可以使用輸入列表。您可以直接在您的usr_str上迭代。

+0

非常感謝Tim,這看起來像是一個簡單的修復程序,而且我理解這兩種方法。我的任務指定使用一個循環,所以第一種方法必須是我使用的,但很高興知道有更簡單的方法! – Stensby

+0

雖然使用'[:]'可能太不明顯了,所以我只是增加了另外一種方式 - 它對你來說更加明顯;-)並且增加了另一種方式來擺脫其中一個列表。 –

2

這可以通過使用str.translate方法來完成:

In [10]: 'Testing!!!!,)'.translate(str.maketrans('', '', string.punctuation)) 
Out[10]: 'Testing '