Python: ¿Python tiene un operador condicional ternario?

5 minutos de lectura

Si Python no tiene un operador condicional ternario¿es posible usar otras construcciones de lenguaje para simular una?

  • En la documentación oficial de Python 3.0 a la que se hace referencia en un comentario anterior, esto se denomina “expresiones_condicionales” y se define de forma muy críptica. Esa documentación ni siquiera incluye el término “ternario”, por lo que sería difícil encontrarlo a través de Google a menos que supiera exactamente qué buscar. los documentación de la versión 2 es algo más útil e incluye un enlace a “PEP 308”que incluye mucho contexto histórico interesante relacionado con esta pregunta.

    –Brent Bradburn

    10 de enero de 2013 a las 5:57

  • “ternario” (que tiene tres entradas) es una propiedad consecuente de esta implementación, no una propiedad definitoria del concepto. por ejemplo: SQL tiene case [...] { when ... then ...} [ else ... ] end para un efecto similar pero nada ternario.

    – usuario313114

    15 de diciembre de 2014 a las 21:14


  • también ISO/IEC 9899 (el estándar del lenguaje de programación C) sección 6.5.15 lo llama “el operador condicional”

    – usuario313114

    15 de diciembre de 2014 a las 21:20

  • Wikipedia cubre esto a fondo en el artículo “?:“.

    – Hola Adios

    9 de junio de 2016 a las 8:11

  • En los años transcurridos desde el comentario de nobar, el documentación de expresión condicional ha sido actualizado para decir Expresiones condicionales (a veces llamadas “operador ternario”)…

    –Scott Martín

    15 de agosto de 2018 a las 13:25

Puede indexar en una tupla:

(falseValue, trueValue)[test]

test necesita volver Cierto o Falso.
Podría ser más seguro implementarlo siempre como:

(falseValue, trueValue)[test == True]

o puede usar el incorporado bool() para asegurar un booleano valor:

(falseValue, trueValue)[bool(<expression>)]

  • Tenga en cuenta que este siempre evalúa todo, mientras que la construcción if/else solo evalúa la expresión ganadora.

    – SilverbackNet

    4 de febrero de 2011 a las 2:25

  • (lambda: print("a"), lambda: print("b"))[test==true]()

    -Dustin Getz

    8 de marzo de 2012 a las 19:31

  • Cabe señalar que lo que está dentro de la []s puede ser una expresión arbitraria. Además, por seguridad, puede probar explícitamente la veracidad escribiendo [bool(<expression>)]. los bool() La función ha existido desde v2.2.1.

    – martineau

    31 de mayo de 2012 a las 18:20


  • Hice un truco similar, solo una o dos veces, pero lo hice, al indexar en un diccionario con True y False como las claves: {True:trueValue, False:falseValue}[test] No sé si esto es menos eficiente, pero al menos evita todo el debate entre “elegante” y “feo”. No hay ambigüedad de que estés tratando con un booleano en lugar de un int.

    – JDM

    1 de marzo de 2016 a las 18:43

  • El remedio es usar (probar y [true_value] o [false_value])[0]que evita esta trampa.

    – ThomasH

    21 de octubre de 2009 a las 15:33

  • El operador ternario generalmente se ejecuta más rápido (a veces en un 10-25%).

    – volcán

    13 de enero de 2014 a las 7:52

  • @volcano ¿Tienes una fuente para mí?

    – Orange Tux

    5 de agosto de 2014 a las 12:30

  • @OrangeTux Aquí está el código desmontado. Usar el método sugerido por ThomasH sería aún más lento.

    – bombomb007

    19/03/2018 a las 20:59


<expression 1> if <condition> else <expression 2>

a = 1
b = 2

1 if a > b else -1 
# Output is -1

1 if a > b else -1 if a < b else 0
# Output is -1

  • Este enfatiza la intención principal del operador ternario: selección de valor. También muestra que se puede encadenar más de un ternario en una sola expresión.

    – Roy Tinker

    4 oct 2010 a las 21:14


  • @Craig, estoy de acuerdo, pero también es útil saber qué sucederá cuando no haya paréntesis. En código real, yo también tendería a insertar paréntesis explícitos.

    – Jon Coombs

    1 dic 2014 a las 21:30

  • Utilizar: return 3 if t > 10 else t/2

    – minutos

    25 oct 2020 a las 16:41

Desde la documentación:

Las expresiones condicionales (a veces denominadas “operador ternario”) tienen la prioridad más baja de todas las operaciones de Python.

La expresion x if C else y primero evalúa la condición, C (no x); si C es verdad, X se evalúa y se devuelve su valor; de lo contrario, y se evalúa y se devuelve su valor.

Ver PEP 308 para obtener más detalles sobre las expresiones condicionales.

Nuevo desde la versión 2.5.

  • Este enfatiza la intención principal del operador ternario: selección de valor. También muestra que se puede encadenar más de un ternario en una sola expresión.

    – Roy Tinker

    4 oct 2010 a las 21:14


  • @Craig, estoy de acuerdo, pero también es útil saber qué sucederá cuando no haya paréntesis. En código real, yo también tendería a insertar paréntesis explícitos.

    – Jon Coombs

    1 dic 2014 a las 21:30

  • Utilizar: return 3 if t > 10 else t/2

    – minutos

    25 oct 2020 a las 16:41

En 2006 se agregó un operador para una expresión condicional en Python como parte de Propuesta de mejora de Python 308. Su forma difiere de la común. ?: operador y es:

<expression1> if <condition> else <expression2>

que es equivalente a:

if <condition>: <expression1> else: <expression2>

Aquí hay un ejemplo:

result = x if a > b else y

Otra sintaxis que se puede utilizar (compatible con versiones anteriores a la 2.5):

result = (lambda:y, lambda:x)[a > b]()

donde estan los operandos perezosamente evaluado.

Otra forma es indexando una tupla (que no es consistente con el operador condicional de la mayoría de los demás idiomas):

result = (y, x)[a > b]

o diccionario explícitamente construido:

result = {True: x, False: y}[a > b]

Otro método (menos confiable), pero más simple, es usar and y or operadores:

result = (a > b) and x or y

sin embargo, esto no funcionará si x sería False.

Una posible solución es hacer x y y listas o tuplas como las siguientes:

result = ((a > b) and [x] or [y])[0]

o:

result = ((a > b) and (x,) or (y,))[0]

Si está trabajando con diccionarios, en lugar de usar un condicional ternario, puede aprovechar get(key, default)por ejemplo:

shell = os.environ.get('SHELL', "/bin/sh")

Fuente: ?: en Python en Wikipedia

  • result = {1: x, 0: y}[a > b] es otra variante posible (True y False son en realidad números enteros con valores 1 y 0)

    -Walter Tross

    9 de febrero de 2019 a las 18:07

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad