2012-02-11 9 views
39

He estado trabajando en un juego de texto en Python, y he encontrado una instancia en la que quiero formatear una cadena de manera diferente en función de un conjunto de condiciones.Formato de cadena condicional de Python

Específicamente, quiero mostrar el texto que describe los elementos en una habitación. Quiero que se muestre esto, en la descripción de la sala, si y solo si el objeto objeto en cuestión está en la lista de elementos del objeto de la sala. Tal como está configurado, creo que simplemente concatenar cadenas basadas en condicionales no se emitirá como yo quiero, y sería mejor tener una cadena diferente para cada caso.

Mi pregunta es, ¿hay algún método pythonic para formatear cadenas basado en el resultado de un booleano condicional? Podría usar una estructura de bucle for, pero me preguntaba si había algo más fácil, similar a la expresión de un generador.

Busco algo similar a esto, en forma de cadena

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

Como ejemplo general de lo que quiero decir:

print "At least, that's what %s told me." %("he" if gender == "male", else: "she") 

que se dan cuenta que este ejemplo no es válida en Python, pero muestra, en general, lo que estoy buscando. Me pregunto si hay alguna expresión válida para el formato de cadenas booleanas, similar a la anterior. Después de buscar un poco, no pude encontrar nada relacionado específicamente con el formato de cadena condicional. Encontré varias publicaciones en cadenas de formato en general, pero eso no es lo que estoy buscando.

Si algo así existe realmente, sería muy útil. También estoy abierto a cualquier método alternativo que pueda sugerirse. Gracias de antemano por cualquier ayuda que pueda brindar.

+2

si quita la coma y el punto y coma se vuelve válido pytho n – yurib

+0

Solución sin código: use 'ellos' (sé que eso no es lo que pidió + sé que esta pregunta es bastante antigua) – poxip

+0

@poxip, que no es gramaticalmente correcto a menos que el pronombre se refiera a más de una persona. Al decir eso, creo que alguna guía de estilo se ha ido y ya aprobó esta construcción impensable, pero creo que es basura. – Bobort

Respuesta

68

Su código realmente es Python válido si elimina dos caracteres, la coma y los dos puntos.

>>> gender= "male" 
>>> print "At least, that's what %s told me." %("he" if gender == "male" else "she") 
At least, that's what he told me. 

Más estilo moderno utiliza .format, sin embargo:

>>> s = "At least, that's what {pronoun} told me.".format(pronoun="he" if gender == "male" else "she") 
>>> s 
"At least, that's what he told me." 

donde el argumento de formato puede ser un dict a construir en cualquier complejidad te gusta.

+1

Gracias. Pensé que habría una configuración así, pero creo que no utilicé los términos de búsqueda adecuados. Es bueno saber que es posible, y que sabía más sobre el estilo de Python de lo que pensaba. –

+5

@NiklasR: 'str.format()' se introdujo en Python 2.6, no en 2.7. –

+2

@SvenMarnach Oh, lamento que tengas razón. –

7

Hay una expresión condicional en Python que toma la forma

A if condition else B 

Su ejemplo puede ser fácilmente convertido en Python válida omitiendo sólo dos personajes:

print ("At least, that's what %s told me." % 
     ("he" if gender == "male" else "she")) 

Una alternativa a menudo me había preferir es usar un diccionario:

pronouns = {"female": "she", "male": "he"} 
print "At least, that's what %s told me." % pronouns[gender] 
Cuestiones relacionadas