2009-10-05 30 views
7

Estoy haciendo una lista en 2D y me gustaría inicializarla con una lista de comprensión. Me gustaría que haga algo como esto:Python: comprensión de la lista para asignar diferentes valores

[[x for i in range(3) if j <= 1: x=1 else x=2] for j in range(3)] 

por lo que debe devolver algo como:

[[1,1,1], 
[1,1,1], 
[2,2,2]] 

¿Cómo podría yo ir haciendo esto?

Gracias por su ayuda.

Respuesta

14

Parece como si estuviera buscando algo como esto:

[[1 if j <= 1 else 2 for i in range(3)] for j in range(3)] 

El pitón conditional expression es un poco diferente de lo que pueda ser utilizada si viene de algo como C o Java:

La expresión x if C else y evalúa primero C (no x); si C es verdadero, x se evalúa y se devuelve su valor; de lo contrario, se evalúa y y se devuelve su valor.

Una forma un poco más corto para hacer la misma cosa es:

[[1 if j <= 1 else 2]*3 for j in range(3)] 
+0

Esto es bueno ya que puedo escalar fácilmente cambiando el tamaño de la gama y cambiar la sentencia condicional. ¡Gracias! – Nope

14

respuesta de Greg es correcta, aunque una expresión mucho más simple y más rápido para producir el resultado deseado sería

[[j] * 3 for j in (1, 1, 2)] 

es decir, recuerde que for no necesita aplicarse a un range solamente ;-), existe multiplicación de listas, y así sucesivamente ;-).

+0

Me gusta esta respuesta, limpio – Juparave

+0

¿Esto permite que la mesa siga siendo mutable? digamos que quiero cambiar [0] [0] a 10, ¿cambiará eso alguno de los otros valores? – Nope

+0

@Casey - No, no cambiará ninguno de los otros valores. –

1

try que

>>> [[(1 if j<1 else 2) for i in range(3)] for j in range(3)] 
[[1, 1, 1], [2, 2, 2], [2, 2, 2]] 

La segunda vez j = 1, de modo j < 1 falla

Cuestiones relacionadas