J'ai du mal avec un script pour remplacer les lettres normales en caractères spéciaux pour tester un système de traduction, voici un exemple (cha-mate est chá-mate mais serait testé avec chã-mate / chã-máte et d'autres variantes), mais au lieu de créer ces variations, il passe tous les mêmes caractères à une seule lettre spéciale, voici ce qu'il imprime:

chá-máte
chã-mãte

Voici ce qui devrait s'imprimer en théorie:

cha-máte
cha-mãte
chá-mate
chã-mate
etc.

Voici le code et le json utilisés:

def translation_tester(word):
    esp_chars = {
        'a': 'áã',
    }

    #words = [word]
    for esp_char in esp_chars:
        if esp_char in word:
            replacement_chars = esp_chars[esp_char]
            for i in range(len(replacement_chars)):
                print(word.replace(esp_char, replacement_chars[i]))

def main():
    words = ['cha-mate']
    for word in words:
        translation_tester(word)

main()

Quoi qu'il en soit, toute aide est appréciée, merci d'avance!

3
user9159043 13 mars 2019 à 16:13

2 réponses

Meilleure réponse

Pour gérer un nombre arbitraire de remplacements, vous devez utiliser la récursivité. C'est comme ça que je l'ai fait.

intword = 'cha-mate'
esp_chars = {'a': 'áã'}

def wpermute(word, i=0):
    for idx, c in enumerate(word[i:], i):
        if c in esp_chars:
            for s in esp_chars[c]:
                newword = word[0:idx] + s + word[idx + 1:]
                wpermute(newword, idx + 1)
        if idx == len(word) -1:
            print(word)

wpermute(intword)

Ce qui donne la sortie de 9 façons différentes d'écrire le mot.

chá-máte
chá-mãte
chá-mate
chã-máte
chã-mãte
chã-mate
cha-máte
cha-mãte
cha-mate
0
Spinor8 13 mars 2019 à 14:48

Il peut y avoir une meilleure façon de le faire, mais vous pouvez faire ce qui suit (en veillant à inclure le simple «a» dans la liste des caractères de remplacement):

import itertools
import re

def replace_at_indices(word, new_chars, indices):
  new_word = word
  for i, index in enumerate(indices):
    new_word = new_word[:index] + new_chars[i] + new_word[index+1:]
  return new_word

def translation_tester(word):
    esp_chars = {
        'a': 'aáã',
    }

    for esp_char in esp_chars:
      replacement_chars = list(esp_chars[esp_char])
      indices = [m.start() for m in re.finditer(esp_char, word)]
      product = list(itertools.product(replacement_chars, repeat=len(indices)))
      for p in product:
        new_word = replace_at_indices(word, p, indices)
        print(new_word)

def main():
    words = ['cha-mate']
    for word in words:
        translation_tester(word)

main()

Pour votre exemple, cela devrait vous donner:

cha-mate
cha-máte
cha-mãte
chá-mate
chá-máte
chá-mãte
chã-mate
chã-máte
chã-mãte

Voir également:

Trouver toutes les occurrences d'une sous-chaîne en Python

générer des permutations avec des répétitions en python

Remplacement d'un caractère d'un certain index

0
Mixolydian 13 mars 2019 à 14:51