2013-12-11 8 views
0

В настоящее время я делаю небольшой проект для домашних животных, и я зашел так далеко, в настоящее время мой код принимает строку, меняет строку на соответствующий шифр и отображает ее, но отображает всю итерированную строку. Что я делаю неправильно? Я хочу только переведенную строку.Итерация над списком

Код

def encrypt_letter(letter): 
    cipher = {'a': 'n', 'b': 'o', 'c': 'p', 'd': 'q', 
       'e': 'r', 'f': 's', 'g': 't', 'h': 'u', 
       'i': 'v', 'j': 'w', 'k': 'x', 'l': 'y', 
       'm': 'z', 'n': 'a', 'o': 'b', 'p': 'c', 
       'q': 'd', 'r': 'e', 's': 'f', 't': 'g', 
       'u': 'h', 'v': 'i', 'w': 'j', 'x': 'k', 
       'y': 'l', 'z': 'm'} 
    lowercase_letter = letter.lower() 
    return cipher[lowercase_letter] 

def encrypt(string): 
    result = [] 
    letters = list(string) 
    for letter in letters: 
     encrypted_letter = encrypt_letter(letter) 
     result.append(encrypted_letter) 
     print "".join(result) 

e = encrypt("hello") 
print e 

Выход

u 
ur 
ury 
uryy 
uryyb 
None 

Ожидаемый результат

'uryyb' 

ответ

3

Одно незначительное изменение будет делать! То, что вы хотите, это строка return.

def encrypt(string): 
    result = [] 
    letters = list(string) 
    for letter in letters: 
     encrypted_letter = encrypt_letter(letter) 
     result.append(encrypted_letter) 
    return "".join(result) # change to return 

e = encrypt("hello") 
print e # will give you expected output 

В самом деле, вы можете написать короткий код с этим:

def encrypt(string): 
    cipher = {'a': 'n', 'b': 'o', 'c': 'p', 'd': 'q', 
       'e': 'r', 'f': 's', 'g': 't', 'h': 'u', 
       'i': 'v', 'j': 'w', 'k': 'x', 'l': 'y', 
       'm': 'z', 'n': 'a', 'o': 'b', 'p': 'c', 
       'q': 'd', 'r': 'e', 's': 'f', 't': 'g', 
       'u': 'h', 'v': 'i', 'w': 'j', 'x': 'k', 
       'y': 'l', 'z': 'm'} 
    return ''.join(cipher[s] for s in string.lower()) 
1

Ваш print находится внутри петли for; отделить его на один уровень, то есть

result.append(encrypted_letter) 
print "".join(result) 

Это предотвратит повторную печать через петлю. Кроме того, ничего не получает return ред от вашей функции, добавьте:

return result 

в конце (или в дополнение к или замене print), чтобы отправить вывод e.

2

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

  1. Dedent print "".join(result) один уровень.

  2. В этой строке, изменить print на return.

Вот полный код:

def encrypt_letter(letter): 
    cipher = {'a': 'n', 'b': 'o', 'c': 'p', 'd': 'q', 
       'e': 'r', 'f': 's', 'g': 't', 'h': 'u', 
       'i': 'v', 'j': 'w', 'k': 'x', 'l': 'y', 
       'm': 'z', 'n': 'a', 'o': 'b', 'p': 'c', 
       'q': 'd', 'r': 'e', 's': 'f', 't': 'g', 
       'u': 'h', 'v': 'i', 'w': 'j', 'x': 'k', 
       'y': 'l', 'z': 'm'} 
    lowercase_letter = letter.lower() 
    return cipher[lowercase_letter] 

def encrypt(string): 
    result = [] 
    letters = list(string) 
    for letter in letters: 
     encrypted_letter = encrypt_letter(letter) 
     result.append(encrypted_letter) 
    ###################### 
    return "".join(result) 
    ###################### 

e = encrypt("hello") 
print e 

Выход:

uryyb 
1

Проблема заключается в том, что

print "".join(result) 

падает в течение цикла.

0

Я бы вернул строку из encrypt, а не распечатал ее.

def encrypt(string): 
    result = "" 
    for letter in list(string): 
     result += encrypt_letter(letter) 
    return result 

print(encrypt("hello")) 
0
def encrypt(string): 
    return ''.join([encrypt_letter(letter) for letter in string]) 

выход:

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