tri de 2 variables

tri de 2 variables - Python - Programmation

Marsh Posté le 05-05-2014 à 15:41:47    

Bonjour,
toujours débutant mais ayant fait des progrès, je me trouve confronté à un nouveau problème que je n'arive pas à résoudre.
 
une partie de mon programme consiste à trier une suite de lettre et de chiffres pour les rendre lisibles dans une notation particulière.
 
Je me trouve avec des parties remplies( par exemple ici des chiffres romains dans bMSL) que je dois mettre dans ma variable bMThRomain si celle ci est vide. Si cette dernière possède déja des chiffres romains il suffit de les laisser dans la variable.
Pour la suite j'ai besoin des différentes fonctions thromain().
 
Le problème est: si bMSL est vide il me retourne [] ce qui est correct, par contre si bMSL contient des letrres, il me retourne trois fois les mêmes lettres.
Comment faire pour n'avoir qu'une fois les même lettres?
 
Voici le programme qui résume mon problème:
 
 
# -*-coding:Latin-1 -*
 
bMSL=['V','I','I']
bMThRomain =[]
def thromain():
    #on extrait l'acronyme lettre romaine
    for lettre in bMSL:
        if lettre in "IV":
            bMThRomain.append(lettre)
    return bMThRomain
 
 
def essai ():
    #on répond en fonction de bMThRomain
    if thromain()==[]:
        thromain()
    elif thromain()!=[]:
        thromain()
    return thromain()
 
 
 
print (essai())
 
 
 
 
Merci de votre aide.

Reply

Marsh Posté le 05-05-2014 à 15:41:47   

Reply

Marsh Posté le 06-05-2014 à 13:35:05    

Pas sûr d'avoir compris.
 
Si tu veux ne garder que les lettres, tu peux écrire :
 

Code :
  1. res = [lettre for lettre in bMSL if lettre in "VI"]


---------------
rule #1 : trust the python
Reply

Marsh Posté le 06-05-2014 à 15:57:08    

Je vais essayer de  formuler différemment  mon problème.
 
En fait j'ai trois entrées possibles pour une même variable:  
 soit trois lettres (prises dans A B C D)
 soit un chiffre arabe de 1 à 8
 soit un chiffre romain de I à VIII
 
Donc lorsqu'une entrée est faite les 2 autres variables sont vides et je dois les calculer pour avoir en résultat final l'affichage des 3 modes différents.
 
Dans l'exemple que je donne mon entrée se fait par un chiffre romain.
def thromain() vérifie qu'il s'agit bien d'un I ou d'un V
puis def essai() teste si le chiffre romain est vide  et renvoi vide, et s'il est renseigné devrait renvoyer le chiffre romains. Le probléme est qu'il le renvoie mais 3 fois (par exemple si je r'e'ntre VII il renvoie VII,VII,VII).
Que faire ?

Reply

Marsh Posté le 06-05-2014 à 17:04:07    

As-tu essayé mon code ?


---------------
rule #1 : trust the python
Reply

Marsh Posté le 06-05-2014 à 18:05:20    

Oui; mais je ne suis pas sûr de l'avoir mis au bon endroit
def thromain():
    #on extrait l'acronyme lettre romaine
    res = [lettre for lettre in bMSL if lettre in "VI"]
    return bMThRomain  
 
et il me retourne[]

Reply

Marsh Posté le 07-05-2014 à 09:52:16    

docbour a écrit :

Comment faire pour n'avoir qu'une fois les même lettres?


En n'appellant pas 5 fois une fonction avec des effets de bord? Là ton machin met les lettres "correctes" dans une variable globale (bMThRomain) et renvoie son contenu, donc à chaque appel ça ajoute les lettres trouvés à l'existant, qui contient déjà le bordel ajouté dedans par les appels précédents. Si rien ne matche c'est une noop, mais si tu trouves des caractères ils se retrouvent accumulés en triple (et en quadruple si tu inverses tes clauses)

 

Pourquoi tu as un bordel pareil au lieu d'une fonction pure, et accessoirement pourquoi tu appelles ta fonction à répétition au lieu de l'appeler une seule fois et de regarder son résultat?


Message édité par masklinn le 07-05-2014 à 09:53:20

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 07-05-2014 à 13:59:39    

OK!
j'ai donc fait:
 
# -*-coding:Latin-1 -*
 
bMSL=['V','I','I']
bMThRomain =[]
def thromain():
    #on extrait l'acronyme lettre romaine
    for lettre in bMSL:
        if lettre in "IV":
            bMThRomain.append(lettre)
 
    if bMThRomain==[]:
            bMThRomain
    elif bMThRomain!=[]:
            bMThRomain
    return bMThRomain
print (thromain())
 
et cela marche.
Merci

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed