2010-11-23 60 views
467

¿Cómo puedo hacer lo siguiente en Python?if/else en la lista de Python comprensión?

row = [unicode(x.strip()) for x in row if x is not None else ''] 

Esencialmente:

  1. reemplazar todos los Nones con cadenas vacías, y luego
  2. desempeñan la función principal.
+3

posible duplicado de [? ¿Es posible el uso de 'persona' en una lista por comprensión pitón] (http://stackoverflow.com/questions/2951701/is-it- possible-to-use-else-in-a-python-list-understanding) –

Respuesta

734

Puede hacer totalmente de eso, es simplemente una cuestión de pedido:

[ unicode(x.strip()) if x is not None else '' for x in row ] 

Tenga en cuenta que esto en realidad utiliza una construcción del lenguaje diferente, un conditional expression, que en sí misma no es parte de la comprehension syntax, mientras que el if después de for…in es parte de la lista de comprensiones y se utiliza para filtro elementos de la fuente iterable.

Las expresiones condicionales se pueden usar en todo tipo de situaciones en las que desee elegir entre dos valores de expresión basados ​​en alguna condición. Esto hace lo mismo que el ternary operator ?: that exists in other languages. Por ejemplo:

value = 123 
print(value, 'is', 'even' if value % 2 == 0 else 'odd') 
+86

Tenga en cuenta que el if/else aquí es ahora la sintaxis de "operador ternario" y no enumera la sintaxis de comprensión. –

+1

Dada la pregunta anterior de OP, @ ¡la observación de Adam es muy importante! – delnan

+7

Es por eso que prefiero poner el operador ternario entre corchetes, lo hace más claro que es solo una expresión normal, no una comprensión. –

30

Una manera:

def change(f): 
    if f is None: 
     return unicode(f.strip()) 
    else: 
     return '' 

row = [change(x) for x in row] 

Aunque entonces usted tiene:

row = map(change, row) 

O puede utilizar una línea de lambda.

+8

Esta es también una buena (tal vez única) técnica para usar cuando tiene que manejar posibles excepciones de la expresión 'if' o código en su o en el bloque de instrucción' else'. La respuesta aceptada es mejor para casos simples. – martineau

+1

Esto es mucho más fácil de leer que usarlo en una lista de comprensión. –

25

Aquí es otro ejemplo ilustrativo:

>>> print(", ".join(["ha" if i else "Ha" for i in range(3)]) + "!") 
Ha, ha, ha! 

Se aprovecha el hecho de que if i evalúa a False para 0 y para True para todos los demás valores generados por la función de range(). Por lo tanto, la lista de comprensión evalúa de la siguiente manera:

>>> ["ha" if i else "Ha" for i in range(3)] 
['Ha', 'ha', 'ha'] 
Cuestiones relacionadas