为什么这会导致“索引超出范围”错误?

时间:2016-04-27 21:31:31

标签: python indexing

我制作了一个自动应用我开发的加密程序。在一个特定的代码中,我继续得到“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

2 个答案:

答案 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