python гласные в нижний регистр и согласные в верхний регистр - PullRequest
1 голос
/ 10 июля 2020

Я новичок в python и застрял на этом конкретном упражнении. Я пытаюсь создать программу, которая принимает ввод от пользователя (строку) и переводит все гласные в нижний регистр и согласные в верхний регистр.

Пример ввода: "Learning python is fun." Ожидаемый результат: "LeaRNiNG PYTHoN iS FuN."

Это то, что я пробовал:

def toggle(phrase):
    for letter in phrase:
        if letter not in "aeiou":
            letter = letter.upper()
        elif letter in "AEIOU":
            letter = letter.lower()
        else:
            letter = letter.upper()
    return phrase


print(toggle(input("Enter a phrase: ")))

Однако выход ничего не переключает. Что мне не хватает?

Ответы [ 3 ]

4 голосов
/ 10 июля 2020

Проблема в том, что вы перебираете итерацию фразы и, назначая букву, вы фактически не меняете буквы во фразе.

Вы можете перевернуть всю строку в верхний, а затем использовать str.translate

vowel_trans = str.maketrans('AEIOU', 'aeiou')
def toggle(phrase):
    return phrase.upper().translate(vowel_trans)

В случае, если этого будет недостаточно, вы можете сгенерировать строку во время цикла с использованием того же logi c и вернуть эту строку.

def toggle(phrase):
    new_phrase = ''
    for letter in phrase.upper():
        if letter in 'AEIOU':
            new_phrase += letter.lower()
        else:
            new_phrase += letter

EDIT

Это также можно сократить до понимания:

def toggle(phrase):
    return ''.join(l.lower() if l in 'AEIOU' else l for letter in phrase)

Или даже с помощью re:

import re

def toggle(phrase):
    return re.sub('AEIOU', 'aeiou', phrase.upper())
1 голос
/ 10 июля 2020

когда вы говорите letter = letter.upper, вы фактически не меняете содержимое строки phrase, вы просто меняете строку, на которую указывает переменная letter.

Фактически, вы не можете изменять строки в python. Попробуйте запустить "hello"[0] = "g", и вы получите сообщение об ошибке.

Одно из решений - вместо попытки изменить строку phrase, мы можем построить новую строку и вставить в нее правильные буквы. Вот что я имею в виду:

def toggle(phrase):
    answer = ""
    for letter in phrase:
        if letter not in "aeiouAEIOU":
            answer = answer + letter.upper()
        else:
            answer = answer + letter.lower()
    return answer


print(toggle(input("Enter a phrase: ")))

когда вы запустите это, вы получите

Enter a phrase: Learning python is fun.
LeaRNiNG PYTHoN iS FuN.

Может показаться, что я изменяю строку, когда говорю answer = answer + letter.upper(), но что на самом деле происходит так, что, как и в случае с letter, я фактически не меняю строку, я просто создаю новую строку (answer + letter.upper()) и присваиваю значение этой строки переменной answer. Это тонкое, но важное различие.

Я также изменил способ, которым вы решаете, следует ли использовать верхний или нижний регистр, чтобы заставить его работать с гласными нижнего регистра. Как у вас было изначально, если текущая буква "a", запускается ветвь else, и она переводится в верхний регистр, когда не должна. Это потому, что "a" находится в "aeiou", а не в "AEIOU", поэтому ветвь else запускается и получает верхний регистр.

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

Полагаю, вы хотели сказать: «Все гласные в нижнем регистре, а все согласные в верхнем регистре»

def toggle(phrase):
    new_phrase = ""
    for letter in phrase:
        if letter in ['a', 'e', 'i', 'o', 'u'] or letter in ['A', 'E', 'I', 'O', 'U']:
            new_phrase += letter.lower()
        else:
            new_phrase += letter.upper()
    return new_phrase


print(toggle(input("Enter a phrase: ")))
...