Это обман, но я бы выбрал следующий подход:
def string_bump(s):
letter_list = "abcdefghijklmnopqrstuvwxyza" #note the extra 'a' at the end
old_positions = []; new_positions = []
for character in s:
old_positions.append(letter_list.find(character))
for pos in old_positions:
new_positions.append(pos+1)
new_string = ""
for pos in new_positions:
new_string += letter_list[pos]
return new_string
for s in ["abc", "bcd", "xyz"]:
print("before:", s, "after:", string_bump(s))
печатает:
before: abc after: bcd
before: bcd after: cde
before: xyz after: yza
По сути, я сканирую строку, чтобы преобразовать символы в позиции валфавитная строка;добавьте 1 к каждой позиции;и восстановить строку из этих позиций.«Чит» добавляет дополнительный «а», поэтому позиция-25 (считая от 0) «z» переводит в эту дополнительную позицию-26 «а».
Если это вас оскорбляет, вы можете оставитьлишний «а» и вместо этого просто сделайте еще один проход в списке позиций, и когда вы увидите «26» (что будет после конца letter_list
без «а»), сбейте его до нуля.
Это просто подтверждение концепции для вашего примера;чтобы поддержать произвольное смещение, вы должны расширить letter_list
для полного алфавита и использовать по модулю на входе (например, n = n%26
), чтобы вход остался в диапазоне.
Кроме того, я бы фактически использовал выражения списка вместо циклов for
, но вы, возможно, еще не встречали их, поэтому вместо них я использовал более явные циклы for
.