簡體   English   中英

Python 中的字符串索引超出范圍

[英]String index out of range in Python

def romanToNum(word):
    word = word.upper()

    numeralList2 = list(zip(
        [1000, 500, 100, 50, 10, 5, 1],
        ['M', 'D', 'C', 'L', 'X', 'V', 'I']
    ))
    num = 0
    x = []
    a = 0
    b = 2


    if len(word) % 2 != 0:
        word = word + "s"

    for i in range(0,len(word)):
        x.append(word[a:b])
        a = a + 2
        b = b + 2
        print(x[i]) 

    for n in x:
        for nNum,rNum in numeralList2:
            if n == rNum:
                num = nNum + num 
            elif n == (n[0] + n[1]):
                num = (nNum*2) + num             
            elif n[0] == rNum:
                r1 = 0
                r1 = nNum
            elif n[1] == rNum:
                r2 = 0
                r2 = nNum
            elif r1 < r2:
                num = num + (r2 - r1)
            elif r1 > r2:
                num = num + (r1 + r2)            
    return num        

romanToNum("xxx")

我收到以下錯誤:

  elif n == (n[0] + n[1]):
IndexError: string index out of range

我把它放在循環中的哪個位置並不重要,它只是不會識別n有一個索引值。

我也收到此錯誤: Traceback (most recent call last):

當我調用我的函數時指向它: romanToNum("xxx")

我真的不知道是怎么回事,因為我加入了print語句,在那里我追加我的列表,並至少一個指數[0]當我打印了這一切。 這里有什么幫助嗎?

我已經通過堆棧查看了類似的問題,但它們的解決方案是縮進,或者因為它們有一個負索引( [-1] )或類似的東西,但我所有的縮進都是正確的,我的索引都是正的。

那么nx一個元素。 n == n[0] + n[1]上的IndexError意味着某個n長度小於2

您添加了一個word = word + 's'以防止在x中包含一個字符元素,但它並沒有真正起作用。

如果您查看如何構建x列表,請執行以下操作:

x = []
a = 0
b = 2


if len(word) % 2 != 0:
    word = word + "s"

for i in range(0,len(word)):
    x.append(word[a:b])
    a = a + 2
    b = b + 2
    print(x[i]) 

因此,在您的示例中,您以x = []word = 'XXX' 然后添加s以獲得word = 'XXXs'

i上的循環執行以下操作:

  • i=0所以x.append(word[0:2]); a = a+2; b = b+2 x.append(word[0:2]); a = a+2; b = b+2 x.append(word[0:2]); a = a+2; b = b+2使得x = ['XX']a=2b=4

  • i=1所以x.append(word[2:4]); a = a+2; b = b+2 x.append(word[2:4]); a = a+2; b = b+2 x.append(word[2:4]); a = a+2; b = b+2使得x = ['XX', 'Xs']a=4b=6

  • i=2所以x.append(word[4:6]); a = a+2; b = b+2 x.append(word[4:6]); a = a+2; b = b+2 x.append(word[4:6]); a = a+2; b = b+2使得x = ['XX', 'Xs', '']a=6b=8
  • i=3所以x.append(word[6:8]); a = a+2; b = b+2 x.append(word[6:8]); a = a+2; b = b+2 x.append(word[6:8]); a = a+2; b = b+2使得x = ['XX', 'Xs', '', '']a=8b=10

在這里你看到n可以是空字符串,這意味着當你做n == n[0] + n[1]你最終會得到一個IndexError

我相信您想將字符兩兩分組,但是i應該使用2的步驟:

for i in range(0, len(word), 2):
    x.append(word[i:i+2])

這樣i0 ,然后是2 ,然后是4等等


順便說一句:一旦你解決了這個問題,條件n == n[0] + n[1]看起來很奇怪,因為如果n是一個兩個字符的字符串(如果你修復代碼應該是這樣)那么條件就會永遠是真實的。 你到底想在這里做什么?

這是罪魁禍首:

for i in range(0,len(word)):
     x.append(word[a:b])
     a = a + 2
     b = b + 2

在此循環結束時, x 將是['XX', 'Xs', '', ''] 由於您將字符分組為兩個一組,因此組的總數將是字符串長度的一半。 所以只需將range(0,len(word)/2)range(0,len(word),2)的迭代次數減半

您的第一個 for 循環出現問題,超出預期,將空字符串影響到x[i] 它可能應該是: for i in range(int(len(word)/2)):

然后你的第二個循環也需要修復。

if n == rNum :永遠不會實現,因為 rNum 是一個單字符串並且 x 的長度是 2。嘗試n == rNum+"s" 對於 2 個字符的字符串, n == n[0] + n[1]始終為 True。 你的意思是n == rNum * 2

此外,建議使用x += 1而不是x = x + 1

暫無
暫無

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

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