【问题标题】:Why does this give a "Index out of range" error?为什么这会出现“索引超出范围”错误?
【发布时间】:2016-08-22 10:16:57
【问题描述】:

我制作了一个程序来自动应用我开发的加密。在一段特定的代码中,我不断收到“字符串索引超出范围”错误。

这段代码有什么作用?

下面的代码创建了一个数组,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

【问题讨论】:

  • 如果您需要一个文本块是等宽的,标准的解决方案是对其进行代码格式化,即使它不是严格的代码。
  • 你真的应该使用 str.join() 而不是将 list 发送到 str() 并替换所有不需要的字符。
  • 我的代码在某些方面确实不干净,但主要关注的是导致该错误的原因。
  • 清理代码通常可以帮助您发现错误。
  • @DevilApple227 i - 1 对于某些i >=1i < lend2,大于d 元素的长度。正确的变量名称会有所帮助。

标签: python indexing


【解决方案1】:

我将发布此评论作为答案,因为我认为它很好地总结了问题。

你假设

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 个字符,则会得到 ​​p>

['abcde', 'fghij', 'k']

您仍在使用 i 的相同值,并且您仍在尝试访问索引 0 和 1,但这将在第三个字符串上失败,因为它只是一个字符。

请注意,在这种失败的情况下,顶部的方程式为

11 % 5 >= 11 // 5
     1 >= 2

这不是真的。

【讨论】:

  • 啊,实际上,我刚刚意识到我在源代码中遗漏了一个非常重要的部分。在我的源代码中,我将 X 添加到字符串中,以便它均匀地决定为 5。所以 abcdef 将变为 A B C D E \n F X X X X
【解决方案2】:

我认为您正在尝试在内部执行'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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 2020-09-04
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多