2010-02-13 4 views
2

Je vais sur la translittération d'une langue source (fichier d'entrée) à une langue cible (fichier cible) donc je vérifie les mappages équivalents dans un dictionnaire dans mon code source, certains caractères dans le code source n'ont pas un mappage équivalent comme la virgule (,) et tous les autres symboles spéciaux. Comment vérifier si le personnage appartient au dictionnaire pour lequel j'ai un mappage équivalent et même prendre soin des symboles spéciaux à imprimer dans le fichier cible qui n'ont pas de correspondance équivalente dans le dictionnaire. Je vous remercie:).Python - pour vérifier si un char est dans le dictionnaire et si je ne veux pas le traiter

+1

Err, est-ce une question différente de celle de votre thread précédent: http://stackoverflow.com/questions/2257731/search-and-replace-characters-in-a-file-with-python? –

+0

Son lié, mais différent Sir .. – boddhisattva

+0

Traduire une grammaire à l'autre en utilisant vos petites mains peut ne pas être la meilleure idée de votre semaine. Vous éviterez beaucoup de douleur en utilisant un lexer ... –

Répondre

1

Je pense que vous voulez quelque chose comme ceci:

tokenMapping = {"&&" : "and"} 

for token in source file: # <-- pseudocode 
    translatedToken = tokenMapping[token] if token in tokenMapping else "transliteration unknown" 

S'il y a une traduction dans le dictionnaire (par exemple « & & » -> « et »), il utilisera cela. Sinon, cela se traduira par "translittération inconnue".

Espérons que cela a aidé. Comme suggéré par LeafStorm, la fonction get d'un dictionnaire peut être utilisée pour simplifier le code ci-dessus. La ligne de code dans la boucle deviendrait

translatedToken = tokenMapping.get(token, "transliteration unknown") 
+0

vais juste vérifier et revenir à vous Monsieur .. – boddhisattva

+0

J'ai besoin de courir le code entier, je suis actuellement en train de traiter certaines erreurs vont sûrement revenir à vous monsieur Merci pour votre temps :) – boddhisattva

0
dictx = {} 
for itm in my_source : 
    dictx[itm] = dictx.get(itm, 0) + 1 

Je ne comprends pas complètement les détails de votre question, mais voici l'exemple le plus simple que je pourrais penser à qui illustre le modèle que je pense que vous êtes après.

La méthode 'get' je crois est ce que vous voulez. Il vous permet de récupérer une clé à partir d'un dictionnaire, mais si la clé n'est pas là, vous pouvez définir une valeur par défaut - "Je veux dictx [itm] (la valeur assignée à la clé 'itm') mais si ' itm 'n'est pas dans le dictionnaire, puis le créer et la valeur de.

Cet extrait parcourt votre document source ('my_source') et compte la fréquence de ses différents éléments, en ajoutant ces chiffres en tant que valeurs aux clés déjà présentes dans votre dictionnaire, mais lorsqu'il atteint un élément pour lequel aucune clé existe, pas d'exception est levée, une clé est ajoutée et une valeur de « 0 » attribué

+0

Laissez-moi vous donner un exemple Sir .. Dites le fichier source Contaings "Salut! Que faites-vous" Maintenant, je dois vérifier pour chaque char ou un ensemble de char et voir pour leur translittération équivalente dans un dictionnaire, mais certains caractères comme '!' sont à copier comme c'est de la source à la destination et ils n'ont pas d'équivalent en translittération mais leurs formes originales .. Ma question était de savoir si c'est dans le dictionnaire et d'imprimer son équivalent le cas échéant, et sinon comment affiche le caractère d'origine (comme '!') tel qu'il est si aucun équivalent n'existe dans le dictionnaire. Merci pour votre soutien Monsieur .. :) – boddhisattva

3

Ma recommandation, étant donné que rules est une cartographie des caractères à leurs équivalents translittération.

results = [] 
for char in source_text: 
    results.append(rules.get(char, char)) 
return ''.join(results) # turns the list back into a string 

a La méthode get de dict retourne la valeur d'une clé ou une valeur par défaut si la touche ot exist - normalement, la valeur par défaut est None, mais dans ce cas, nous avons donné le même caractère que la valeur par défaut (le second argument) de sorte que si la clé n'est pas trouvée, elle retournera elle-même.

Une façon plus compacte d'écrire cela en utilisant les expressions du générateur serait:

''.join((rules.get(char, char) for char in source_text)) 
0

Cela semble assez simple. Si votre dictionnaire est char à char, alors vous feriez quelque chose comme

outstr = '' 
for ch in instr: 
    if ch in mydict: 
     outstr += mydict[ch] 
    else: 
     outstr += ch 

Ici, instr est votre chaîne d'entrée et mondict contient votre carte de caractères à caractères.

Si vous voulez vérifier des parties de mots, je vous recommande d'utiliser deux dictionnaires: un qui contient les caractères contenus dans un mot et un qui contient les mots.Vous pouvez l'utiliser comme ceci:

outstr = '' 
word = '' 
for ch in instr: 
    if ch in chardict: 
     word += ch 
    else: 
     if len(word): 
      if word in worddict: 
       outstr += worddict[word] 
      else: 
       outstr += word 
      word = '' 
     outstr += ch 
if len(word): 
    outstr += worddict[word] 
else: 
    outstr += word 

chardict peut contenir tout l'alphabet par exemple. Bien sûr, vous voudrez peut-être faire quelques parties un peu différemment (comme utiliser autre chose que chardict pour vérifier si un char doit être considéré comme faisant partie d'un mot valide - peut-être quelque chose avec une recherche binaire) .

3

Si vous utilisez la méthode translate d'objets Unicode, comme je l'ai recommandé en réponse à une autre question de la vôtre, tout est fait automatiquement pour vous exactement comme vous le souhaitez: chaque caractère Unicode c dont codepoints (ord(c)) n'est pas dans le dictionnaire de translittération est simplement passé inchangé de l'entrée à la sortie, comme vous le souhaitez. Pourquoi réinventer la roue?

+0

Point Sir .. :) Je vais essayer cette méthode. – boddhisattva

Questions connexes