Как я могу сократить этот код замещения шифра? - PullRequest
2 голосов
/ 28 марта 2020

Входная строка будет состоять только из букв c символов. Функция должна вернуть строку, в которой все символы были перемещены «вверх» на две точки в алфавите.

Например:

  • «a» станет «c»
  • "z" станет "b"

Я написал этот код, но я думаю, что он слишком длинный. Как я могу сделать его короче и лучше?

def encrypt_message(strings: str) -> str:
    our_al = ["a", "b", "c", "d", "e", "f", "g", "h", "i", 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u',
              'v', 'w', 'x', 'y', 'z']
    new_s = ""
    for character in strings:
        index = our_al.index(character)
        if index <= 23:
            index += 2
            new_s += our_al[index]
        elif index == 24:
            new_s += our_al[0]
        elif index == 25:
            new_s += our_al[1]

    return new_s


print(encrypt_message("abc"))
print(encrypt_message("xyz"))
print(encrypt_message(""))

Ответы [ 4 ]

3 голосов
/ 28 марта 2020

Некоторые утилиты будут полезны. Если вы используете эту функцию несколько раз, вы не всегда хотите итерировать символы, чтобы найти индекс, поэтому поиск dict.

from string import ascii_lowercase as al

index = {c: i for i, c in enumerate(al)}

def encrypt_message(s: str) -> str:
    return ''.join(al[(index[c] + 2) % 26] for c in s)

>>> encrypt_message('xyz')
'zab'
2 голосов
/ 28 марта 2020

вы можете использовать itertools.islice и itertools.cycle, чтобы получить следующий символ (который расположен на 2 позиции вперед):

from itertools import islice, cycle
from string import ascii_lowercase

def get_next_2(c):
    index = ascii_lowercase.index(c)
    return next(islice(cycle(ascii_lowercase), index + 2, None))

def encrypt_message(strings):
    return ''.join(map(get_next_2, strings))

, если вам нравится однострочное решение, вы можете использовать:

from string import ascii_lowercase as al

def encrypt_message(strings):
    return ''.join([al[(al.index(c) + 2) % 26] for c in strings])
1 голос
/ 28 марта 2020

Вы можете сделать два улучшения:

  • использовать строковый модуль для получения букв алфавита
    • string.ascii_lowercase - это строка всех строчных букв ASCII (вы просто здесь нужен итератор, а не список, так что строка в порядке)
  • используйте оператор модуля (%), чтобы упростить вычисления
    • оператор модуля "оборачивает" вычисления, поэтому (25 + 2) % 26 оценивается как 1
def encrypt_message(strings: str) -> str:
    new_s = ""
    for character in strings:
        if character not in string.ascii_lowercase:
            continue
        index = string.ascii_lowercase.index(character)
        new_index = (index + 2) % len(string.ascii_lowercase)
        new_s += string.ascii_lowercase[new_index]
    return new_s
0 голосов
/ 28 марта 2020

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

for character in strings:
    if character not in string.ascii_lowercase:
        continue
    index = ord(character) - 96
    new_index = (index + 2) % 26 + 96 # a is 97
return chr(new_index)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...