Несколько замен строк в одной строке - PullRequest
0 голосов
/ 26 февраля 2020

Я получил строку alphabet = "abcdefghijklmn" и хотел бы заменить каждый гласный в строке значениями из матрицы подстановки matrix = { 'a' : 'FIRST VOWEL', 'e' : 'SECOND VOWEL', 'i' : 'THIRD VOWEL' }. Я предполагаю, что это случай рекурсии, поэтому я попробовал следующую функцию:

import re

def iterrepl(string):
    m = re.search(r'[aeiou]',string)
    if m:
         string = string[:m.start()]+matrix.get(m.group())+string[m.end():]
         iterrepl(string)
    else:
         return(string)

matrix = { 'a' : 'FIRST VOWEL', 'e' : 'SECOND VOWEL', 'i' : 'THIRD VOWEL' }
alphabet = "abcdefghijklmn"

print(iterrepl(alphabet))

Окончательный результат, однако, равен None, тогда как я надеялся на FIRST VOWELbcdSECOND VOWELfghTHIRD VOWELjklmn. Когда я добавляю оператор print перед вызовом iterrepl внутри функции, я вижу, что желательным является результат последней, но одной рекурсии:

FIRST VOWELbcdefghijklmn
FIRST VOWELbcdSECOND VOWELfghijklmn
FIRST VOWELbcdSECOND VOWELfghTHIRD VOWELjklmn
None

Я не могу понять, что не так с окончанием рекурсии и буду признателен за любые советы!

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

Если рекурсия, как вы подразумеваете, ваш выбор , а не требование , то вы делаете это сложнее, чем необходимо, так как Python имеет встроенные функции для этого:

matrix = {'a': 'FIRST VOWEL', 'e': 'SECOND VOWEL', 'i': 'THIRD VOWEL'}

alphabet = "abcdefghijklmn"

translation_table = str.maketrans(matrix)

print(alphabet.translate(translation_table))

ВЫХОД

> python3 test1.py
FIRST VOWELbcdSECOND VOWELfghTHIRD VOWELjklmn
>

Или мы могли бы просто сделать:

matrix = {'a': 'FIRST VOWEL', 'e': 'SECOND VOWEL', 'i': 'THIRD VOWEL'}

alphabet = "abcdefghijklmn"

for old, new in matrix.items():
    alphabet = alphabet.replace(old, new)

print(alphabet)

ВЫХОД

> python3 test2.py
FIRST VOWELbcdSECOND VOWELfghTHIRD VOWELjklmn
>

Или если должен быть рекурсивным, то, возможно, что-то вроде:

matrix = {'a': 'FIRST VOWEL', 'e': 'SECOND VOWEL', 'i': 'THIRD VOWEL'}

alphabet = "abcdefghijklmn"

def replace_vowels(string):

    def replace_vowels_recursive(string, dictionary):
        if dictionary:
            (vowel, replacement), *rest = dictionary.items()

            return replace_vowels_recursive(string.replace(vowel, replacement), dict(rest))

        return string

    return replace_vowels_recursive(string, matrix)

print(replace_vowels(alphabet))

ВЫХОД

> python3 test3.py
FIRST VOWELbcdSECOND VOWELfghTHIRD VOWELjklmn
>
0 голосов
/ 26 февраля 2020

Ваш вопрос не очень понятен, однако, если вы хотите получить желаемую отдачу от функции «ПЕРВЫЙ VOWELbcdSECOND VOWELfghTHIRD VOWELjklmn», попробуйте следующее:

def iterrepl(string):

    string_arr = []
    for x in range(0, len(string)):
        string_arr.append(string[x:x+1]) #enter every char into a list.

        for y in range(0, len(matrix)):
            if string_arr[x] == matrix.keys()[y]: #search list for match.
                string_arr[x] = matrix[matrix.keys()[y]] #found. replace list item and break loop.
                break

    return str(''.join(string_arr)) #convert back to string.


matrix = { 'a' : 'FIRST VOWEL', 'e' : 'SECOND VOWEL', 'i' : 'THIRD VOWEL' }
alphabet = "abcdefghijklmn"

print(iterrepl(alphabet))
...