我尝试使用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
答案 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;我们无法访问。第二个网格将起作用。