Как мне сохранить заглавную букву в том же положении? - PullRequest
3 голосов
/ 14 апреля 2019

Мне нужна функция, которая обратит гласные в текстовой строке.Я обнаружил, что если я использую text [item] .upper (), он создает отдельное пространство, где вносятся изменения, но это не влияет на исходный список.

Строка, подобная 'Ello world', должна выглядетькак «Ollo werld», но проблема в том, что моя функция возвращает исходную строку как «ollo wErld».

Ответы [ 3 ]

3 голосов
/ 14 апреля 2019

Вы можете просто заменить свое письмо на заглавную, например:

text[x] = text[x].upper()

РЕДАКТИРОВАТЬ: Я не знаю, почему я получил отрицательное голосование, но когда вы заменяете строки вызовами функций .lower () и .upper (), как предложено, вы получите ожидаемый результат.

1 голос
/ 14 апреля 2019
def reversevowel(text):
    cap_indexes = [a for a, b in enumerate(text) if b.isupper()]
    text = list(text.lower())
    vowels = ('aeiouAEIOU')

    x = 0
    y = len(text) - 1

    while x < y:
        while (text[x] not in vowels and x < min(len(text) - 1, y)):
            x += 1

        while (text[y] not in vowels and y > max(0, x)):
            y -= 1

        text[x], text[y] = text[y], text[x]
        x += 1
        y -= 1

    for n in cap_indexes:
        text[n] = text[n].upper()

    return ''.join(text)
0 голосов
/ 14 апреля 2019
def reversevowel(text):
    vowels = 'aeiouAEIOU'

    text_list = list(text)

    char_position = []
    char_uppercase = []
    char_list = []

    # Iterate through characters in text
    for i, c in enumerate(text_list):
        if c in vowels:
            char_position.append(i)  # Add vowel position to list
            char_uppercase.append(c.isupper())  # Add uppercase boolean to list
            char_list.insert(0, c)  # Use as stack. Insert character

    zipped_list = list(zip(char_position, char_list, char_uppercase))

    for letter in zipped_list:
        position, character, uppercase = letter
        text_list[position] = str(character).upper() if uppercase else str(character).lower()

    return ''.join(text_list)

EDIT: эта функция возвращает требуемый результат, избегая использования вложенных циклов.

...