2015-01-30 2 views
0

Я пытаюсь использовать 2d сетчатый шифр для шифрования строки в Python, но мои вложенные петли вызывают ошибки вне диапазона.Python - Вложенные циклы, вызывающие indexerror

Вот мой код:

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

'range (n)' такой же, как 'range (0, n)'. 0 неявно –

+0

Вы пытались заменить индексы?С 'i' вы перебираете столбцы и' j' над каждой подстрокой. Поэтому вы должны использовать их для этого. – glglgl

+0

Вы проверили свой массив, чтобы увидеть, являются ли его элементы ожидаемой длиной? – tdelaney

ответ

0

Проблема (попробуйте печать split) является то, что все элементы в split не обязательно rows долго:

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

Вы должны решить, что Вы хотите сделать. Возможно, добавьте пробелы в конец последней строки, если это недостаточно.

Возможно, вы также захотите взглянуть на enumerate. Счастливый взлом.

Update: Допустим, вы решили использовать 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) 

Update 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 
+0

Это не проблема, извините. Даже когда строки четные, я все равно получаю ошибку. EDIT: Извиняюсь, я перепутал i и j, и выясняется, что это проблема. Большое спасибо! –

+0

работает для меня, после небольших изменений (см. Обновление) –

1

Проблема возникает из-за того, что ваша строка ввода не может быть кратной строкам. Например, используя 3 столбца «Ввод строки для шифрования» не удается зашифровать, поскольку он создает список разделов ['Inp', 'ut', 'Str', 'ing', 'to', 'En', ' cry ',' pt ']. Обратите внимание, что последний элемент в массиве имеет только 2 элемента.

Если подушечка ваш входной строки с пробелом, как: «Входная строка для шифрования» шифрования работает как раскол производит: [ «INP», «ут», «ул», «ИНГ», 'к ',' En ',' cry ',' pt ']

+0

Да! Спасибо. Это большая помощь! –

0

Ошибки были вызваны строками, которые не гарантированы регулярностью, и длина строки не делится на количество столбцов все время.

(не хватает репутации размещать изображения, извините)

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

Первая сетка не будет работать, так как есть 4 пустых мест после второго «!» что мы не можем получить доступ. Вторая сетка будет работать.

Смежные вопросы