I think you're making this a lot more complicated than it needs to be. Forgive my rusty python, but you should be able to do something like
def viginere_encrypt(message, key): length = len(message) mnum = [0]*length for i in range(0, length): mnum[i] = letter_to_number(message[i]) knum = [0]*len(key) for i in range(0, len(key)): knum[i] = letter_to_number(key[i] result = [0]*length for i in range(0, length): result[i] = number_to_letter(mnum[i] + knum[i % len(key]) return resultdef letter_to_num(letter): return ord(letter) - ord("a")def number_to_letter(number): return chr(number%alpha + ord("a"))
Using list comprehensions, this can be shortened to
def viginere_encrypt(message, key): mnum = [letter_to_number(x) for x in message] knum = [letter_to_number(x) for x in key] return [number_to_letter(mnum[i] + knum[i%len(key)])for i in range(0, len(message)]
or even further to
def viginere_cipher(message, key): return [number_to_letter(letter_to_number(message[i]) + letter_to_number(key[i % len(key)])) for i in range(0, len(message)])
though that's probably too mushed together by now.
Also, I don't know python too well; there's probably a better way to convert between "a-z" and 0-25.
Anyways, functions are a Very Good Idea. Output can then be separated from business logic, so if, say, you need to use the cipher elsewhere in your code, you're not tied to the terminal. It also allows for much easier testing.