[英]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]
)或類似的東西,但我所有的縮進都是正確的,我的索引都是正的。
那么n
是x
一個元素。 行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=2
和b=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=4
和b=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=6
和b=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=8
和b=10
。 在這里你看到n
可以是空字符串,這意味着當你做n == n[0] + n[1]
你最終會得到一個IndexError
。
我相信您想將字符兩兩分組,但是i
應該使用2
的步驟:
for i in range(0, len(word), 2):
x.append(word[i:i+2])
這樣i
是0
,然后是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.