Ваш алгоритм не делать то, что вы ожидаете, потому что внутренняя петля
for i in range(0,int(len(lettersTab)/2)):
устанавливает secondTab[j]
в wordTab[j]
на каждом шаге цикла, даже если wordTab[j]
не соответствует lettersTab[i]
, который не то, что вы хотите.
Обратите внимание, что newstr = oldstr.replace(a, b)
делает newstr
= oldstr
oldstr
, если не содержит a
.
Таким образом, приведена очищенная версия вашей функции плюс несколько прогрессивных уточнений, в последнем примере с использованием списка списка. Некоторые из моих версий используют index()
, которые выдадут исключение, если он не сможет найти то, что он ищет, но ваш исходный код страдает от аналогичной проблемы.
Я изменил имя функции, потому что encode
является стандартной строковой функцией в Python 2 (которую я запускаю).
#! /usr/bin/env python
'''
Caeser encryption
From http://stackoverflow.com/questions/25950099/my-program-dont-work-i-dont-know-why
'''
import sys
def caeser_encode0(letters, code, word):
lettersTab = list(letters) * 2
howMany = code % len(letters)
wordTab = list(word)
secondTab = [None] * len(word)
for j in range(0, len(word)):
for i in range(0, int(len(lettersTab)/2)):
if wordTab[j] == lettersTab[i]:
secondTab[j] = wordTab[j].replace(lettersTab[i], lettersTab[i + howMany])
print(wordTab[j], lettersTab[i], lettersTab[i + howMany], secondTab)
print(secondTab)
def caeser_encode1(letters, code, word):
lettersTab = list(letters) * 2
howMany = code % len(letters)
wordTab = list(word)
secondTab = []
for ch in word:
for i in range(0, int(len(lettersTab)/2)):
if ch == lettersTab[i]:
secondTab.append(lettersTab[i + howMany])
print(ch, lettersTab[i], lettersTab[i + howMany], secondTab)
print(secondTab)
def caeser_encode2(letters, code, word):
lettersTab = list(letters) * 2
howMany = code % len(letters)
secondTab = []
for ch in word:
i = lettersTab.index(ch)
secondTab.append(lettersTab[i + howMany])
print(ch, lettersTab[i], lettersTab[i + howMany], secondTab)
print(secondTab)
def caeser_encode3(letters, code, word):
howMany = code % len(letters)
secondTab = []
for ch in word:
i = letters.index(ch)
newi = (i + howMany) % len(letters)
secondTab.append(letters[newi])
print(ch, letters[i], letters[newi], secondTab)
print(secondTab)
def caeser_encode4(letters, code, word):
howMany = code % len(letters)
secondTab = []
for ch in word:
newi = (letters.index(ch) + howMany) % len(letters)
secondTab.append(letters[newi])
print(ch, letters[newi], secondTab)
print(secondTab)
def caeser_encode(letters, code, word):
howMany = code % len(letters)
secondTab = [
letters[(letters.index(ch) + howMany) % len(letters)] for ch in word]
print(secondTab)
def main():
caeser_encode("bca", 2, "abc")
if __name__ == '__main__':
main()
Будем надеяться, что вы (или кто-то :)) будет узнать больше о Python из этих примеров ...
Я думаю, что вы должны размещать больше кода - строка, содержащая свой сборник/синтаксической ошибки ISN 'т присутствует в вашем фрагменте. –
Вам не хватает конечных скобок в строке, начинающейся с 'secondTab [j] = ...'. –
Вы пытались пройти через код * вручную * с помощью карандаша и бумаги? Добавьте этот оператор печати в * верхний * внутреннего цикла. Это может помочь вам диагностировать проблему. '' 'print '{} \ t {: <18} \ t {} \ t {}'. format ((j, i), secondTab, wordTab, lettersTab)' '' – wwii