recorrer por listas lista comprensiĆ³n anidadas python list-comprehension

por - listas anidadas python



Si/else en la lista de comprensiĆ³n de Python? (5)

¿Cómo puedo hacer lo siguiente en Python?

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

Esencialmente:

  1. Reemplace todos los Nones con cadenas vacías, y luego
  2. realizar una función.

Aquí hay otro ejemplo ilustrativo:

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

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

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


De una sola mano:

def change(f): if f is None: return unicode(f.strip()) else: return '''' row = [change(x) for x in row]

Aunque entonces tienes:

row = map(change, row)

O puedes usar un lambda en línea.


El problema específico ya se resolvió en las respuestas anteriores, por lo que abordaré la idea general de usar condicionales dentro de la lista de comprensión.

Aquí hay un ejemplo que muestra cómo se pueden escribir los condicionales dentro de una lista de comprensión:

X = [1.5, 2.3, 4.4, 5.4, ''n'', 1.5, 5.1, ''a''] # Original list # Extract non-strings from X to new list X_non_str = [el for el in X if not isinstance(el, str)] # When using only ''if'', put ''for'' in the beginning # Change all strings in X to ''b'', preserve everything else as is X_str_changed = [''b'' if isinstance(el, str) else el for el in X] # When using ''if'' and ''else'', put ''for'' in the end

Tenga en cuenta que en la primera lista de comprensión para X_non_str , el orden es:

valor para expresión1 si expresión2

y en la última lista de comprensión de X_str_changed , el orden es:

valor1 si expresión1 más valor2 para expresión2

Siempre me resulta difícil recordar que value1 tiene que ser antes si y value2 tiene que ser después de otra cosa . Mi cabeza quiere que ambos sean antes o después.

Supongo que está diseñado así porque se asemeja al lenguaje normal, por ejemplo, "Quiero quedarme dentro si llueve, de lo contrario quiero salir".


Las otras soluciones son excelentes para una sola construcción if / else . Sin embargo, las afirmaciones ternarias dentro de las listas de comprensión son posiblemente difíciles de leer.

El uso de una función facilita la lectura, pero es difícil extender o adaptar una solución de este tipo en un flujo de trabajo en el que la asignación es una entrada. Un diccionario puede aliviar estas preocupaciones:

row = [None, ''This'', ''is'', ''a'', ''filler'', ''test'', ''string'', None] d = {None: '''', ''filler'': ''manipulated''} res = [d.get(x, x) for x in row] print(res) ['''', ''This'', ''is'', ''a'', ''manipulated'', ''test'', ''string'', '''']


Puedes hacerlo totalmente, es solo un problema 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 de lenguaje diferente, una expresión condicional , que en sí misma no es parte de la sintaxis de comprensión , mientras que el if the for…in es parte de las comprensiones de lista y se utiliza para filtrar elementos de la fuente iterable.

Las expresiones condicionales se pueden usar en todo tipo de situaciones en las que desea elegir entre dos valores de expresión en función de alguna condición. ¿Esto hace lo mismo que el operador ternario ?: Que existe en otros idiomas . Por ejemplo:

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