我制作了一个自动应用我开发的加密程序。在一个特定的代码中,我继续得到“String Index out of range”错误。
此代码的作用是什么?
以下代码创建一个数组,d。它将字符串的某些部分附加到数组中。代码的目的是从宽度为5的文本中创建一个矩形,这意味着如果原始文本是“abcdefghijkl”,那么想法是将其转换为
a b c d e
f g h i j
k l X X X
代码的最后一行给出错误“字符串索引超出范围”为什么?在代码的早期,正如我忘记提到的那样,我将X添加到字符串的末尾,以便它均匀地分成5个。
d = []
for x in range(1,length/5+2):
d.append(string[(x-1)*5:5*x])
d2=str(d).replace('[','').replace(']','').replace("'",'').replace(',','').replace(' ','')
lend2=len(d)
new=''
for i in range(1,lend2):
new += str([l[i-1] for l in d]).replace('[','').replace(']','').replace("'",'').replace(',','').replace(' ','')
完整错误文字:
new += str([l[i-1] for l in d]).replace('[','').replace(']','').replace("'",'').replace(',','').replace(' ','')
IndexError: string index out of range
答案 0 :(得分:2)
我发布此评论作为答案,因为我认为它很好地总结了这个问题。
你正在假设
N % M >= N // M
对于N和M的所有值。虽然有时这是真的,但并非总是如此。如果不成立,则会出现索引错误。
在您的计划中,N
== len(input string)
和M
== 5.您正在切换输入字符串M
字符中的字符。因此,对于您的示例输入:abcdefghijkl
您最终会得到
['abcde', 'fghij', 'kl']
当您使用
进行迭代时for i in range(1,lend2):
在这种情况下,你是1到2的范围。然后你通过减去1来引用各个列表项的索引,所以你引用索引0和1,这是有效的。请注意,具有这些值的等式读取
11 % 5 >= 11 // 5
2 >= 2
这是真的。
如果您将输入字符串缩短1个字符,则
['abcde', 'fghij', 'k']
你仍然在i
的相同值,你仍然试图访问索引0和1,但是在第3个字符串上会失败,因为它只是一个字符。
请注意,在这种失败的情况下,顶部的等式读取
11 % 5 >= 11 // 5
1 >= 2
这不是真的。
答案 1 :(得分:0)
我认为您在内部尝试'string'[i][j]
。虽然您的代码几乎不可读,但这是我从仔细检查中收集到的内容。
你不能获得一个字母的第n个元素,只能获得第一个元素。
'string'[0][0] == 's'
'string'[0][1] ==
字符串索引超出范围
a = 'asd'
for i in range(1, len(a)):
[l[i-1] for l in a] # During the first loop, l == 'a'
# You're trying to grab l[i-1] that doesn't exist