¿Cómo puedo hacer lo siguiente en Python?
row = [unicode(x.strip()) for x in row if x is not None else '']
Esencialmente:
- reemplace todos los Nones con cadenas vacías, y luego
- cumplir una función
python
list-comprehension
AP257
fuente
fuente
Respuestas:
Puedes hacer eso totalmente. Es solo un problema de pedido:
En general,
Y, solo para las comprensiones de listas con
if
condiciones,Tenga en cuenta que esto realmente usa 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
if
despuésfor…in
es parte de las comprensiones de listas y se usa para filtrar 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 en función de alguna condición. Esto hace lo mismo que el operador ternario
?:
que existe en otros idiomas . Por ejemplo:fuente
l = [ 2, 3, 4, 5]
entonces[x if x % 2 == 0 for x in l]
me da error mientras[x if x % 2 == 0 else 200 for x in l]
funciona. Sí, sé filtrarlo, debo escribir[ x for x in l if x % 2 == 0]
. Perdón por la molestia. Gracias por tu respuesta.De una sola mano:
Aunque entonces tienes:
O puede usar una lambda en línea.
fuente
if
expresión o el código en suelse
bloque de instrucciones. La respuesta aceptada es mejor para casos simples.Aquí hay otro ejemplo ilustrativo:
Explota el hecho de que
if i
evalúaFalse
para0
yTrue
para todos los demás valores generados por la funciónrange()
. Por lo tanto, la comprensión de la lista se evalúa de la siguiente manera:fuente
El problema específico ya se ha resuelto en respuestas anteriores, por lo que abordaré la idea general de usar condicionales dentro de las comprensiones de listas.
Aquí hay un ejemplo que muestra cómo se pueden escribir los condicionales dentro de una comprensión de lista:
Tenga en cuenta que en la primera lista de comprensión
X_non_str
, el orden es:y en la última lista de comprensión para
X_str_changed
, el orden es:Siempre me resulta difícil recordar que expresseion1 tiene que estar antes si if y expresión2 tiene que estar después de else . Mi cabeza quiere que ambos sean antes o después.
Supongo que está diseñado así porque se parece al lenguaje normal, por ejemplo, "Quiero quedarme adentro si llueve, de lo contrario quiero salir"
En inglés simple, los dos tipos de comprensiones de listas mencionadas anteriormente podrían expresarse como:
Con solo
if
:y con
if/else
fuente
Las otras soluciones son excelentes para una sola
if
/else
construcción. Sin embargo, las declaraciones ternarias dentro de las comprensiones de listas son posiblemente difíciles de leer.El uso de una función ayuda a la legibilidad, pero tal solución es difícil de extender o adaptar en un flujo de trabajo donde el mapeo es una entrada. Un diccionario puede aliviar estas preocupaciones:
fuente
Tiene que ver con cómo se realiza la comprensión de la lista.
Tenga en cuenta lo siguiente:
Es equivalente a:
Donde el
expression
está en un formato ligeramente diferente (piense en cambiar el tema y el orden verbal en una oración)Por lo tanto, su código
[x+1 for x in l if x >= 45]
hace esto:Sin embargo, este código
[x+1 if x >= 45 else x+5 for x in l]
hace esto (después de reorganizarexpression
):fuente
No hay necesidad de ternary if / then / else. En mi opinión, su pregunta requiere esta respuesta:
fuente
Parece mejor generalizar primero todas las formas posibles en lugar de dar respuestas específicas a las preguntas. De lo contrario, el lector no sabrá cómo se determinó la respuesta. Aquí hay algunas formas generalizadas que pensé antes de que me doliera la cabeza tratando de decidir si una cláusula final podría usarse en la última forma.
El valor de
item
no necesita ser usado en ninguna de las cláusulas condicionales. Aconditional3
puede usarse como un interruptor para agregar o no agregar un valor a la lista de salida.Por ejemplo, para crear una nueva lista que elimine cadenas vacías o espacios en blanco de la lista original de cadenas:
fuente
this if condition else that
o se permite una expresión normal. Novalue = this if condition
(que se puede lograr convalue = this if condition else None
)Puedes combinar la lógica condicional en una comprensión:
fuente
(venv) $ python list_comp.py
Affichage de my_list [0, 1, 2, 3, 4, 5]
Affichage de my_result_list [0, 5, 4, 7, 8, 9]
Entonces, para ti:
row = [('', unicode(x.strip()))[x is not None] for x in row]
fuente