2014-10-12 135 views
1

我正在使用以下代碼。爲什麼我的函數的輸出仍然包含數值?Python:刪除非字母字

功能

def removeNonAplhabet(inputlist): 
    for w in inputlist: 
     if ((w.isalnum()==True) or ((w.isdigit()==True))): 
      inputlist.remove(w); 
    return inputlist;  

主程序

filtered_words=removeNonAplhabet(word_list); 
print ('Removing Non Alphabetical Characters') 
print (filtered_words) 

輸出

['13', '1999', '2001', '280', 'amazon', 'another', 'april'] 

回答

1

刪除項目,而ITER在排列順序確實按預期工作。製作副本,並迭代副本。

或者使用list comprehensionstr.isalpha

>>> def removeNonAplhabet(inputlist): 
...  return [w for w in inputlist if w.isalpha()] 
... 
>>> removeNonAplhabet(['13', '1999', '2001', '280', 'amazon', 'another', 'april']) 
['amazon', 'another', 'april'] 

BTW,str.isalnum將返回True的話,只有字母組成的。

>>> 'abc'.isalnum() 
True 
>>> '123'.isalnum() 
True 
>>> 'a,b'.isalnum() 
False 
+0

感謝您的快速結果。這工作正常。但是,你可以在上面的代碼中指出問題嗎?我很想知道我做錯了什麼。 – Incpetor 2014-10-12 08:19:43

+1

詳細說明:如果您有一個列表['word','word'word'],並且您遍歷該列表以刪除非數字字符串,則結果將爲['word']。爲什麼是這樣?那麼首先評估並刪除索引位置0處的第一個字符串,然後將所有其他字符串向下移位。但是你的電腦認爲它已經處理了位於索引位置0的字符串,所以它不會重新評估它。這意味着它會留在你的列表中...希望這有助於。 – 2014-10-12 08:21:41

+0

@ Inceptor361,迭代序列時刪除元素,使內部指針損壞。 – falsetru 2014-10-12 08:24:38