Python - 导致indexerror的嵌套循环

时间:2015-01-30 22:16:59

标签: python loops nested

我尝试使用2d网格密码加密Python中的字符串,但我的嵌套循环导致超出范围错误。

这是我的代码:

def encrypt():
    before = str(input("Type a string to encrypt: "))
    columns = int(input("How many table columns would you like: "))
    split = [before[i:i+columns] for i in range(0, len(before), columns)]
    rows = len(split)
    after = []
    for i in range(0, columns):
        for j in range(0,rows):
            after.append(split[j][i])
    print(after)

这是我收到的错误:

Traceback (most recent call last):
  File "<pyshell#31>", line 1, in <module>
    encrypt()
  File "E:/Python/cipher.py", line 12, in encrypt
    after.append(split[j][i])
IndexError: string index out of range

3 个答案:

答案 0 :(得分:1)

出现此问题是因为您的输入字符串不能保证是行的倍数。例如,使用3列 &#34;要加密的输入字符串&#34;无法加密,因为它生成一个拆分列表 [&#39; Inp&#39;,&#39; ut&#39;,&#39; Str&#39;&#39;&#39;,&#39;到&#39;,&#39; En&#39;,&#39; cry&#39;,&#39; pt&#39;]。请注意,数组中的最后一个元素只有2个元素。

如果用以下空格填充输入字符串:&#34;输入字符串加密&#34; 加密在分割产生时起作用: [&#39; Inp&#39;,&#39; ut&#39;,&#39; Str&#39;&#39;&#39;,&#39;到&#39;,&#39;恩&#39;,&#39;哭&#39;,&#39; pt&#39;]

答案 1 :(得分:0)

问题(尝试打印split)是split中的所有元素都不一定是rows长:

Type a string to encrypt: hello world
How many table columns would you like: 3
['hel', 'lo ', 'wor', 'ld']

你必须决定你想做什么。如果时间不够长,可能会在最后一个字符串的末尾添加空格。

您可能还想查看enumerate。快乐的黑客攻击。

更新:假设您选择使用2列,并且字符串长度可以被2整除:

Type a string to encrypt: helo
How many table columns would you like: 2
['he', 'lo']
['h', 'l', 'e', 'o']

似乎工作。哦,我不得不稍微改变你的代码,因为输入不符合你的想法:

def encrypt():
    before = raw_input("Type a string to encrypt: ")
    columns = int(raw_input("How many table columns would you like: "))
    split = [before[i:i+columns] for i in range(0, len(before), columns)]
    rows = len(split)
    after = []
    for i in range(0, columns):
        for j in range(0,rows):
            after.append(split[j][i])
    print(after)

更新2 :如果您想使用空格填充输入,只需添加以下行:

before += " " * (columns - len(before) % columns)

你最终会得到这段代码:

def encrypt():
    before = raw_input("Type a string to encrypt: ")
    columns = int(raw_input("How many table columns would you like: "))
    before += " " * (columns - len(before) % columns)
    split = [before[i:i+columns] for i in range(0, len(before), columns)]
    rows = len(split)
    after = []
    for i in range(0, columns):
        for j in range(0,rows):
            after.append(split[j][i])
    print ''.join(after)

示例输出:

Type a string to encrypt: hello world
How many table columns would you like: 4
hore llwdlo 

答案 2 :(得分:0)

错误是由不保证常规的行引起的,字符串长度不能一直被列数整除。

(我没有足够的声誉发布图片,抱歉)

http://i.stack.imgur.com/kaJJo.png

第一个网格不起作用,因为在第二个网格之后有4个空格。!&#39;我们无法访问。第二个网格将起作用。