105 votes

Comment implémenter un formatage de chaîne conditionnel ?

J'ai travaillé sur un jeu en Python basé sur du texte, et j'ai rencontré une situation où je veux formater une chaîne de caractères différemment en fonction d'un ensemble de conditions.

En particulier, je veux afficher du texte décrivant des objets dans une pièce. Je veux que cela soit affiché, dans la description de la pièce, uniquement si l'objet en question est dans la liste d'objets de l'objet pièce. De la manière dont c'est configuré, je pense que simplement concaténer des chaînes en fonction de conditionnelles ne donnera pas le résultat voulu, et il serait préférable d'avoir une chaîne différente pour chaque cas.

Ma question est, y a-t-il une méthode pythonique pour formater des chaînes en fonction du résultat d'une condition booléenne ? Je pourrais utiliser une structure de boucle for, mais je me demandais s'il y avait quelque chose de plus simple, similaire à une expression générateur.

Je recherche quelque chose de similaire à ceci, sous forme de chaîne de caractères

num = [x for x in xrange(1,100) if x % 10 == 0]

Comme exemple général de ce que je veux dire :

print "Au moins, c'est ce que %s m'a dit." %("il" if gender == "male", else: "elle")

Je réalise que cet exemple n'est pas du Python valide, mais il montre, en général, ce que je recherche. Je me demande s'il existe une expression valide pour le formatage de chaînes booléennes, similaire à ce qui précède. Après avoir cherché un peu, je n'ai rien trouvé spécifiquement sur le formatage conditionnel de chaînes. J'ai trouvé plusieurs publications sur les chaînes de format en général, mais ce n'est pas ce que je recherche.

Si quelque chose comme ça existe effectivement, ce serait très utile. Je suis également ouvert à toute méthode alternative qui pourrait être suggérée.

139voto

DSM Points 71975

Votre code est en fait du Python valide si vous supprimez deux caractères, la virgule et le deux-points.

>>> gender= "male"
>>> print "Du moins, c'est ce que %s m'a dit." %("il" if gender == "male" else "elle")
Du moins, c'est ce que il m'a dit.

Un style plus moderne utilise .format, cependant:

>>> s = "Du moins, c'est ce que {pronoun} m'a dit.".format(pronoun="il" if gender == "male" else "elle")
>>> s
"Du moins, c'est ce que il m'a dit."

où l'argument de format peut être un dict que vous construisez avec la complexité que vous souhaitez.

62voto

Boris Points 1440

Utilisez une f-string :

plural = ''
if num_doors != 1:
    plural = 's'

print(f'Fermez la porte{plural}.')

Ou en une seule ligne avec une expression conditionnelle (une version en une ligne de l'instruction if/else):

print(f'Fermez la porte{"s" if num_doors != 1 else ""}.')

Notez que vous devez mélanger les guillemets doubles " et simples ' car jusqu'à Python 3.12, vous ne pouvez pas utiliser de barres obliques inverses pour échapper aux guillemets dans la partie expression d'une f-string. Vous pouvez toujours utiliser des barres obliques inverses dans la partie extérieure d'une f-string, donc f'{2+2}\n' est correct.

18voto

Sven Marnach Points 133943

Il y a une expression conditionnelle en Python qui prend la forme :

A if condition else B

Votre exemple peut facilement être transformé en Python valide en omettant juste deux caractères :

print ("Du moins, c'est ce que %s m'a dit." % 
       ("il" if gender == "male" else "elle"))

Une alternative que je préfère souvent est d'utiliser un dictionnaire :

pronoms = {"female": "elle", "male": "il"}
print "Du moins, c'est ce que %s m'a dit." % pronoms[gender]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X