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')