заменить часть элемента в списке на значение из словаря - Python - PullRequest
0 голосов
/ 12 июля 2020

Я работаю над проектом, который преобразует французские слова в c буквы кириллицы.

dict3 = {"ain":"(ен)",
         "oin":"(уен)"}

dict2 = {"on":"(он)",
        "in":"(ин)",
        "en":"(ен)",
        "eu":"(ё)",
        "an":"(ен)",
        "ou":"у",
        "oi":"уа",
        "au":"о",
        "ai":"э",
        "un":"(ен)",
        "ya":"я",
        "gn":"нь",
        "qu":"к",
        "ch":"ш"
         }

dict1 = {
    "a":"а",
    "b":"б",
    "c":"с",
    "ç":"с",
    "d":"д",
    "e":"",
    "é":"э",
    "è":"э",
    "ê":"э",
    "e ":"е",
    "f":"ф",
    "g":"г",
    "h": "",
    "i":"и",
    "j":"ж",
    "k":"к",
    "l":"л",
    "m":"м",
    "n":"н",
    "o":"о",
    "p":"п",
    "r":"р",
    "s":"с",
    "t":"т",
    "u":"(ю)",
    "v":"в",
    "w":"",
    "x":"кс",
    "y":"(и)",
    "z":"з"
    }
start=str(input())
start = start.split()
sortie = []
for i in range (len(start)):
    for x in range (len(dict3)):
        if dict3[x] in start[i]:
            sortie[i] = start[i][**first part**] + dict3[start[i]] + start[i][**next part**]

Сначала я хочу перебрать dict3, затем dict2 и dict1 , чтобы получить в итоге только кириллицы c букв. Я пытаюсь заставить его изменить только часть слова, когда нашел эту часть в словаре. Так как мне добраться до этого? Спасибо

1 Ответ

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

Если вы думаете о текстах и ​​шаблонах: подумайте regex .

Вы можете создавать шаблоны регулярных выражений из ваших dicts и применять их - начиная с python 3.6i sh на нем будет применяется в порядке создания ключей в dict.

Ваши наборы символов в основном различны - но замена "g" by "r", а затем замена "r" by "p" вызовет проблемы (см. quatrevingtdizaine) - если вам не нужна такая «двойная» замена. Если нет, вам нужно исправить это самостоятельно (например, заменить g на какой-то уникодесимвол, затем обработать r, а затем заменить этот юникодесимол обратно на r).

Применено:

three = {"ain":"(ен)", "oin":"(уен)"}

two = {"on":"(он)", "in":"(ин)", "en":"(ен)", "eu":"(ё)", "an":"(ен)", 
       "ou":"у", "oi":"уа", "au":"о", "ai":"э", "un":"(ен)", "ya":"я", 
       "gn":"нь", "qu":"к", "ch":"ш" }

one = {"a":"а", "b":"б", "c":"с", "ç":"с", "d":"д", "e":"", "é":"э", 
       "è":"э", "ê":"э", "e ":"е", "f":"ф", "g":"г", "h": "", "i":"и",
       "j":"ж", "k":"к", "l":"л", "m":"м", "n":"н", "o":"о", "p":"п", 
       "r":"р", "s":"с", "t":"т", "u":"(ю)", "v":"в", "w":"", "x":"кс", 
       "y":"(и)", "z":"з" }


words = "quatrevingtdizaine l'info au plus près de chez vous".split()

import re

result = []

for word in words:
    fr = word
    print(fr, end = "")
    for d in [three, two, one]:  # dicts in order
        for key, value in d.items():  # key,value pairs in order
            fr1 = fr
            fr = re.sub(key, value, fr)  # substitute stuff
            if fr1 != fr:
                print(" ->", fr, end = "")
    print()  
    result.append(fr)
    
print("", *result, sep="\n")

Выход:

"""
quatrevingtdizaine -> quatrevingtdiz(ен)e -> quatrev(ин)gtdiz(ен)e
-> кatrev(ин)gtdiz(ен)e -> каtrev(ин)gtdiz(ен)e -> каtrev(ин)gtдiz(ен)e 
-> каtrv(ин)gtдiz(ен) -> каtrv(ин)гtдiz(ен) -> каtrv(ин)гtдиz(ен) 
-> каtрv(ин)гtдиz(ен) -> катрv(ин)гтдиz(ен) -> катрв(ин)гтдиz(ен) 
-> катрв(ин)гтдиз(ен)
l'info -> l'(ин)fo -> l'(ин)фo -> л'(ин)фo -> л'(ин)фо
au -> о
plus -> pлus -> плus -> плuс -> пл(ю)с
près -> prэs -> пrэs -> прэs -> прэс
de -> дe -> д
chez -> шez -> шz -> шз
vous -> vуs -> vус -> вус

катрв(ин)гтдиз(ен)
л'(ин)фо
о
пл(ю)с
прэс
д
шз
вус
 
"""
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...