• [^] # Re: Essai

    Posté par . En réponse au message Besoin d'avis sur algo Python. Évalué à 6.

    Bon, j'ai un peu de temps alors je décompose :

    res = ''.join([ A2Z[A2Z.index(car) - MOY] if A2Z.count(car) else car for car in txt ])
    
    

    1 - La base est une list comprehension, outil très puissant que j'utilise très souvent en lieu et place des boucles for qui permet de construire une liste à partir d'une (ou plusieurs) autre liste :

    a = [ fonction(x) for x in liste ]
    
    

    est équivalent à :

    a = []
    for x in liste:
     a.append(fonction(x))
    
    

    2 - A cette list comprehension j'y ai ajouté un ternary operator afin d'ajouter une condition if

    a = [ fonction(x) if (x>0) else fonction(-x) for x in liste ]
    
    

    est équivalent à :

    a = []
    for x in liste:
     if x > 0:
     a.append(fonction(x))
     else:
     a.append(fonction(-x))
    
    

    3 - la fonction appliquée

    A partir du code simplifié, la fonction est assez simple, j'ai simplement supprimé la variable intermédiaire pos.

    Donc chaque caractère inclus dans la liste se voient appliquer cette "fonction" qui renvoie le caractère (majuscule ou minuscule) converti par rot13 (grâce à la liste initiale modifiée pour ajouter les minuscules) :

    A2Z[A2Z.index(car) - MOY]
    
    

    4 - join

    ''.join() doit être appliqué à la liste car la sortie de la list comprenhsion est une liste de caractères, et non une chaine.