почему символы моего слова не сдвигаются на одну позицию в алфавите? - PullRequest
2 голосов
/ 12 июля 2020

Я пытаюсь создать программу, которая берет слово или предложение, а затем сдвигает каждый символ на одно место в алфавите. Это мой минимально воспроизводимый пример:

alphabet = []
alphabet = [chr(x) for x in range(ord('a'), ord('z') +1)]

word = 'hello' 
new_word = [ ] 

for char in word:
    if char in alphabet:
        new_pos = alphabet.index(char) + 1
        if new_pos > len(alphabet):
            new_pos %= len(alphabet)
        new_word.append(alphabet[new_pos])
    else:
        continue

мой вопрос: почему это не сдвигает символы слова на одну позицию в алфавите?

Ответы [ 5 ]

3 голосов
/ 12 июля 2020

Вместо этого вы можете использовать этот список:

word = 'hello'
new_word = ''.join([chr(ord(w)+1) if w.lower()!='z' else chr(ord(w)-25) for w in word])
print(new_word)

Вывод:

ifmmp

Вы также можете:

new_word = ''.join([chr(ord(w)+1) if w not in ['z','Z'] else chr(ord(w)-25) for w in word])
2 голосов
/ 12 июля 2020

Я заставил его работать, сделав new_word строку и выполнив конкатенацию строк (вместо добавления массива).

alphabet = []
alphabet = [chr(x) for x in range(ord('a'), ord('z') +1)]

word = 'hello'
new_word = ''

for char in word:
    if char in alphabet:
        new_pos = alphabet.index(char) + 1
        if new_pos >= len(alphabet):
            new_pos %= len(alphabet)
        new_word = new_word + alphabet[new_pos]
    else:
        continue

print(word, new_word)

Выводит:

hello ifmmp
1 голос
/ 14 июля 2020

Методы str maketrans и translate идеально подходят для этого типа задач:

from string import ascii_lowercase as alphabet

# One time initialization:

translation = str.maketrans(alphabet, alphabet[1:] + alphabet[:1])

# Can be reused multiple times:

words = ('hello', 'add', 'inks ohm', 'end')

for word in words:
    new_word = word.translate(translation)

    print(word, '->', new_word)

ВЫХОД

% python3 test.py
hello -> ifmmp
add -> bee
inks ohm -> jolt pin
end -> foe
% 

программа, которая принимает слово или предложение

Ваш исходный код, ни принятый в настоящее время код, обрабатывает предложение по мере вытеснения пробелов. Приведенный выше код будет правильно обрабатывать предложения, передавая вещи, которые не являются буквами.

Вот переделка вашего кода для правильной обработки предложений:

from string import ascii_lowercase as alphabet

phrase = 'inks ohm'
new_phrase = ''

for character in phrase:
    if character in alphabet:
        new_position = (alphabet.index(character) + 1) % len(alphabet)
        character = alphabet[new_position]

    new_phrase += character

print(new_phrase)

Конечно, все они обрабатывают только нижний регистр, и для правильной обработки предложений вам необходимо расширить их, чтобы также обрабатывать верхний регистр. Упражнение оставлено читателю.

0 голосов
/ 12 июля 2020

В Python часто лучше стремиться к компактным решениям, которые используют выразительную мощь языка вместо дополнительных циклов и временных структур данных. Меньше строк кода = меньше мест для вещей, которые могут go ошибаться.

Ответ от Энн Зен - хороший пример подхода pythoni c. Я немного обобщу это решение, чтобы иметь дело с (1) возможными будущими изменениями в вашем алфавите и (2) обработкой входных символов не в вашем алфавите.

alpha_min, alpha_max = sorted(['a', 'z'])
alpha_count = ord(alpha_max) - ord(alpha_min) + 1 
phrase = 'hello there 123'
new_phrase = ''.join([chr(((ord(w)+1-alpha_min) % alpha_count) + alpha_min) for w in phrase])
print(new_phrase)

Выводы ifmmp uifsf 123.

0 голосов
/ 12 июля 2020

Хороший вопрос, Джорди!
Буквы не могут увеличиваться на 1, но их код ASCII может увеличиваться. Коды ASCII - это числовые представления символов, каждый символ на клавиатуре имеет уникальный код ASCII.

Итак, сначала символ преобразуется в его код ASCII с помощью встроенной функции python ord () и сохраняется в целочисленная переменная num. Затем Num увеличивается на 1, чтобы получить код ASCII следующей буквы. Затем код ASCII преобразуется обратно в символ с помощью функции chr ()

Таким образом, код:

word = 'hello'
new_word = ''

for char in word:
    if char.isalpha():
       num=ord(char)
       num=num+1
       x=chr(num)
       new_word+=x
print(word, new_word)


даст вам результат, который вы ищете для:
hello ifmmp

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...