我在代码上得到了超出范围的错误,请看下面的细节

问题描述 投票:0回答:2

代码:

import random

randomnum = random.randint(1, 256)
enter = "john"
enterlen = (len(enter))
enterarray = [randomnum, enterlen]
i = 0

while i <= enterlen:
    enterarray.append(enter[i])
    i = i + 1

错误:

Traceback (most recent call last):
  File "/home/kdogg/PycharmProjects/starter/encode.py", line 9, in <module>
    enterarray.append(enter[i])
IndexError: string index out of range

我试图用这个数组来制作一个加密代码。我应该从一个随机数开始填入数组,然后填入我要编码的字的长度,然后使用1比1的代码 (a = 1, b = 2, c = 3等)。)

我准备将给出的数字随机相乘(a = 1, b = 2 等),得到两个值之间的数字(a可以是1和25之间,等等,等等),然后将其转换成十六进制来缩小。

例如:假设你把单词ABC.它最终会变成类似这样的东西 (100)(3)(1545784) 首先是随机数,然后是单词长度,然后每个字母将被分配一个介于两个值之间的随机数,然后所有的东西将被转换为十六进制。append().

python encryption
2个回答
2
投票

这很简单。数组从0开始,但是 len() 返回一个项目数,所以你需要减少这个数字。我建议在while循环中把它改为 i < enterlen. 你应该考虑使用for循环。


0
投票

使用 while i<enterlen: 而不是 while i<=enterlen:因为 i 在你的例子中,你一直到4[第5个字符],而John只有4个字符,所以它给出的指数超出了范围。


0
投票

你正试图访问enter[4],它不是该字符串值的有效索引。数组是基于0的索引,因此enter的唯一有效索引是0, 1, 2, 和3.为了解决这个问题,你必须调整你的while循环为i < enterlen.

为了解决你的问题,你必须调整你的while循环为i < enterlen。从而在i = 4时结束。

现在将正确打印[98, 4, 'j', 'o', 'h', 'n']。


0
投票

正如你在其他答案中所看到的,你需要使用的是 < 而不是 <= 因为list使用的是 0len(enter)-1

i = 0

while i < enterlen:
     enterarray.append(enter[i])
     i = i + 1

但相反 while 你可以用 for-循环,然后你就不会有索引的问题。

for char in enter:
    enterarray.append(char)

例如,将ASCII字符转换为数字

for char in enter:
    number = ord(char) - ord('A') + 1
    enterarray.append(number)

A = 1, B = 2, C = 3,等等。a = 33, b = 34, c = 34等。

如果你只想要小写字母,那么你应该使用 ord('a') 而不是 ord('A') and you should convert进入tolower()`以确保你没有大写的字符。

enter = enter.lower()

另外,如果你想只在数组中添加字符,那么你可以这样做。 如果你只想在数组中添加字符,那么你可以使用

enterarray = [randomnum, enterlen] + list(enter)
© www.soinside.com 2019 - 2024. All rights reserved.