2016-10-28 172 views
0

我對python非常陌生,並且閱讀了一些課程材料,並且寫了這個函數來刪除字符串中的特定字符,無論該字符在字符串中有多少次。從字符串中刪除字母

def remove_letter(): #Remove a selected letter from a string 
    base_string = str(raw_input("Enter String: ")) 
    letter_remove = str(raw_input("Enter Letter: ")) #takes any size string 
    letter_remove = letter_remove[0] 
    string_length = len(base_string) 
    location = 0 

    while (location < string_length): #by reference (rather than by value) 
     if base_string[location] == letter_remove: 
      base_string = base_string[:location] + base_string[location+1::] 
      string_length -= 1 
     location+=1 

    print "Result: %s" % base_string 
    return 

現在這裏是什麼我不理解,如果我在字符串中把「asdfasdfasdf」,然後選擇要刪除的「D」它的作品完美的信。但是,如果在字符串中放入「Hello」並選擇刪除字母「l」,則只會刪除一個「l」,結果將爲「Helo」。我不明白爲什麼它的工作,當我把「asdfasdfasdf」,現在「你好」

+0

爲什麼不使用內置的功能,而不是這個創建自己的? ''ababa'.replace('a','')=>'bb'' – Nicarus

+0

我正在學習python,我確定有很多不同的方法可以做到這一點,但更容易,但我喜歡通過學習嘗試不同的東西,看看一切正常,我真的想知道爲什麼這不起作用 – Mafioso1823

+0

如果你現在剛剛學習Python,我個人建議你學習Python 3而不是2。 – Nicarus

回答

0

問題是你的if-statement外面有location+=1

您的代碼原樣在刪除的字母后跳過該字母。

由於在刪除字母的迭代中您同時執行了string_length -= 1location+=1,因此location正在有效地移動兩個索引。

要修復它,您需要做的不僅僅是這一點,因爲在if語句之外還需要location+=1

我剛剛解釋了什麼地方出了問題,現在我得跑,但我看到其他人已經給你解決方案了,所以我並不擔心。祝你好運!

+0

你測試過了嗎?它導致了一個永恆的循環 – Wondercricket

+0

是的,我沒有測試它,它的工作原理如果使用字符串「asdfasdfasdf」並嘗試刪除「d」但不工作,如果我使用「你好」並嘗試刪除「l」 – Mafioso1823

+0

對不起,在我完成編輯之前不得不離開片刻。 –

-1

您可以隨時使用字符串替換。

base_string.replace(letter_remove,"") 
0

考慮

#base_string is 'Hello', location is 2 and string_length is 5. 
base_string = base_string[:location] + base_string[location+1::] #'Helo' 

然後你減少字符串長度和增量的位置。 您的位置是3,但是'Helo'[3] == 'o'而不是'l'。當你從字符串中移除一個元素時,你基本上將所有剩餘字符移動1,所以你不應該更新location,因爲它現在已經指向下一個字符。

while (location < string_length): #by reference (rather than by value) 
    if base_string[location] == letter_remove: 
     base_string = base_string[:location] + base_string[location+1::] 
     string_length -= 1 
    else: 
     location+=1 
0

這是一個錯誤。只有當相同的人物連續出現時,它才能正常工作。

  1. Hello,它忽略了你好第二l當它遇到的第一個l
  2. 如果你試圖Helol,它會刪除這兩個l秒。
  3. 如果您嘗試Helllo,結果將是Helo

解決方案: 當你遇到目標信,刪除它,然後繼續迭代等你更新後的字符串的字符休息比增加location

添加continue將解決您的問題。

while (location < string_length): #by reference (rather than by value) 
    if base_string[location] == letter_remove: 
     base_string = base_string[:location] + base_string[location+1::] 
     string_length -= 1 
     continue 
    location+=1 

測試:

python2 test.py                     Fri 28 Oct 14:25:59 2016 
Enter String: Hello 
Enter Letter: l 
Result: Heo