簡體   English   中英

“字符串索引超出范圍”錯誤,我不明白為什么

[英]'String index out of range' error and I don't understand why

我正在嘗試輸入,刪除元音並打印新短語。

代碼

這是我正在使用的代碼。

phrase = input("Input: ")
for i in range(len(phrase)):
    if str(phrase[i]) in ["a", "A", "e", "E", "i", "I", "O", "o", "u", "U"]:
        phrase = str(phrase[i]).replace(phrase[i], "")  # error here
print(phrase)

問題

在第 3 行,我收到錯誤消息:

字符串索引超出范圍

我不明白如何,因為我認為我將索引限制為短語的長度。

即使有更好的方法來創建這個腳本(我會喜歡任何建議),我也真的很想知道我在做什么錯在哪里以及如何解決它!

迭代時不要修改字符串。 只需保留您想要的字母:

phrase = input("Input: ")
new = []
for c in phrase:
    if c not in "aeiouAEIOU":
        new.append(c)
phrase = ''.join(new)
print(phrase)

或者:

phrase = ''.join([c for c in phrase if c not in "aeiuoAEIUO"])

我認為您不需要i作為索引或range(len(phrase))來替換字符或刪除phrase字符串中的某些字符,如果您打算輸入,刪除元音並打印新短語.

phrase = input("Input: ")
for i in phrase:
    if i in ["a", "A", "e", "E", "i", "I", "O", "o", "u", "U"]:
        phrase = phrase.replace(i, "")
print(phrase)

發現問題

3個問題和1個改進:

  1. for i in range(len(phrase)): : (a) 字符串的len是一個快照,一旦第一個元音被刪除,它將不再適合。 (b) 索引 for-i 循環可以替換為循環字符串中每個字符的for c in phrase的 for-each 循環
  2. if str(phrase[I]) in ["a", "A", "e", "E", "i", "I", "O", "o", "u", "U"] : (a) 不需要字符串轉換, phrase[i]c已經可以與字符串元素進行比較。 (b) 可以直接比較字符是否在一串元音中: if c in "aAeEiIoOuU"
  3. phrase = str(phrase[i]).replace(phrase[i], "") :替換整體中的部分,就像字符串中的一個字符,使用phrase = phrase.replace("a", "") - don' t 替換 position 處的單個字符。
  4. phrase = input("Input: ")為了改進可重復的示例,提供固定的輸入示例: phrase = "Hello World with many Vowels"而不是取決於交互式用戶輸入。

解決方案

我會在這里建議一個好的答案的組合:

  1. 像蒂姆建議的那樣循環字符串中的每個字符
  2. 添加到new_phrase建議的 new_phrase
  3. 替換為空字符串,如您嘗試過並由 ANC 建議
  4. 像 Tim 一樣,比較像"aAeEiIoOuU"這樣的字符串中給定的元音

看起來您正在更新phrase ,同時從 0 迭代到phrase原始長度。 當您在短語中刪除一個字符時,最大有效下標會減少,而i仍將達到原始短語長度。

你可以用filter做得更好。

phrase = input("Input: ")
new_phrase = "".join(filter(lambda c: c not in "aAeEiIoOuU", phrase))
print(new_phrase)

看起來問題是您正在用單數字符重寫整個phrase變量,然后您試圖再次循環它。

在第 4 行中,您將phrase設置為單個字符,然后嘗試再次對其進行循環,但隨后您有了phrase[i] ,但phrase本身現在的長度僅為 1。因此,如果i大於 1(它可能是)它不能那樣做。

此外,您可以直接在字符串上循環,它將直接返回字符串的每個字符。

嘗試在第 4 行構建一個新字符串,例如

phrase = input("Input: ")
new_string = ''
for i in phrase:
    if i not in ["a", "A", "e", "E", "i", "I", "O", "o", "u", "U"]:
        new_string += i
print(new_string)

編輯:根據評論更新代碼

如果我沒記錯,它會返回“IndexError: string index out of range”,因為您只能訪問字符串的一個 position。 通過輸入單個字符或數字,它可以完美運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM