Python: изменить строку согласно правилу

У меня есть список правил и строка. Мне нужно создать новую строку, представляющую собой первоначальную строку, измененную согласно одному из правил (выбирается случайно). Я могу это сделать 6-ю выражениями с if, но как-то хочется придумать более элегантный и общий способ.

from random import choice

vowels = ['а', 'и', 'о', 'у']
consonants = ['н', 'з', 'г', 'ш', 'р', 'т', 'б', 'к', 'х']

rules = ['cVc', 'Cvc', 'cVC', 'CVc', 'cvC', 'CvC']
currentString = 'гор'

Каждое правило из rules представляет собой схему currentString, в которой с значит согласную, v - гласную, а высокий регистр обозначает, какую букву в currentString нужно заменить на случайную. То есть:

  • если мы возьмем первое правило cVc, то на выходе должно получиться newString = 'г' + choice(vowels) + 'р'
  • а если последнее правило CvC, то newString = choice(consonants) + 'о' + choice(consonants).

У кого какие идеи? Было бы оч здорово, если бы кто-нибудь указал бы на метод решения, а не на готовый код, т.к. это помогло бы в обучении. Спасибо!

Edit: с помощью гугла допер до следующего решения:

def newString(currentString):
    rules = ['cVc', 'Cvc', 'cVC', 'CVc', 'cvC', 'reverse']
    rule = choice(rules)

    if rule == 'reverse':
        return currentString[::-1]
    
    else:
        rule_list = list(rule)
        currentString_list = list(currentString)

        for index, character in enumerate(rule_list):
            if character.isupper() and character == 'V':
                currentString_list[index] = choice(vowels)
            if character.isupper() and character == 'C':
                currentString_list[index] = choice(orkishCons)
        return ''.join(currentString_list)

Ответы (1 шт):

Автор решения: Кирилл Малышев

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

from random import choice

vowels = ['а', 'и', 'о', 'у']
consonants = ['н', 'з', 'г', 'ш', 'р', 'т', 'б', 'к', 'х']

rules = ['cVc', 'Cvc', 'cVC', 'CVc', 'cvC', 'CvC']
currentString = 'гор'

res = ''
rule = choice(rules)

for cur, r in zip(currentString, rule):
    if r.islower():
        res += cur
    elif r == 'C':
        res += choice(consonants)
    else:
        res += choice(vowels)

print(rule, currentString, res, sep='\n')

https://ideone.com/X4W3Y4

→ Ссылка