Supongamos que tengo 3 listas como estas
l1 = [1,2,3] l2 = [4,5,6] l3 = [7,8,9]
¿Cómo puedo imprimir todo de estas listas al mismo tiempo? ¿Cuál es la forma pythonica de hacer algo así?
for f in l1,l2 and l3: print f
Esto solo parece estar teniendo en cuenta 2 listas.
Salida deseada: para cada elemento en todas las listas, los estoy imprimiendo usando una función diferente
def print_row(filename, status, Binary_Type): print " %-45s %-15s %25s " % (filename, status, Binary_Type)
y llamo a la función anterior dentro del bucle for.
Creo que es posible que desee zip
for x,y,z in zip(l1,l2,l3): print x,y,z #1 4 7 #2 5 8 #3 6 9
Que estas haciendo:
for f in l1,l2 and l3:
es un poco extraño Básicamente es equivalente a for f in (l1,l3):
ya que l2 and l3
devuelve l3
(asumiendo que l2
y l3
están vacíos, de lo contrario, devolverá el vacío).
Si solo desea imprimir cada lista consecutivamente, puede hacer:
for lst in (l1,l2,l3): #parenthesis unnecessary, but I like them... print lst #[ 1, 2, 3 ] #[ 4, 5, 6 ] #[ 7, 8, 9 ]
No es necesario usar zip
, solo agréguelos usando el operador +
. l1 + l2 + l3
crea una nueva lista que es la combinación de l1
, l2
y l3
por lo que simplemente puede recorrer eso, así:
for f in l1+l2+l3: print(f)
Su uso del operador and
es incorrecto. La otra razón por la que su código no funciona es mediante el uso de comas (como l1, l2, l3
) crea una tupla, que es un contenedor que ahora contiene sus 3 listas. Por lo tanto, cuando intente recorrer 1 l1, l2, l3
, pasará por cada elemento de esa tupla (que son las listas) y no por todos los elementos en las listas como pretende.
Si quieres imprimir
1 4 7 2 5 8 3 6 9
Hacer:
for i,j,k in zip(l1,l2,l3): print i,j,k
Depende de lo que quieras lograr,
>>> #Given >>> l1,l2,l3 = [1,2,3],[4,5,6],[7,8,9] >>> #To print row wise >>> import itertools >>> for f in itertools.chain(l1,l2,l3): print(f,end=" ") 1 2 3 4 5 6 7 8 9 >>> #To print column wise >>> for f in itertools.izip(l1,l2,l3): print(*f,end=" ") 1 4 7 2 5 8 3 6 9 >>>
o la siguiente implementación que funcionará en Python 2.7
>>> for f in itertools.chain(*itertools.izip(l1,l2,l3)): print f, 1 4 7 2 5 8 3 6 9 >>>
Si sus listas no son todas de la misma longitud, a menudo es mejor usar el map
:
>>> l1 = [1, 2, 3] >>> l2 = [4, 5, 6] >>> l3 = [7, 8, 9, 2] >>> for x, y, z in map( None, l1, l2, l3): ... print x, y, z ... 1 4 7 2 5 8 3 6 9 None None 2
Para expandir sobre la respuesta Abhijit, puede usar el generador de itertools como el iterable dentro de una lista de comprensión.
>>> [ n for n in itertools.chain(l1, l2, l3) ] [1, 2, 3, 4, 5, 6, 7, 8, 9]
Si quiere decir que tiene 3 listas de igual longitud y desea imprimir su contenido en 3 columnas, entonces, ¿qué le parece zip () para conectar las columnas y una lista de comprensión para imprimir () en cada iteración?
[ print(row) for row in zip(l1, l2, l3) ]
Lo anterior imprimirá reproducciones de tuple (s). Si desea formatear los valores de lo contrario:
[ print("{} / {} / {}".format(*row)) for row in zip(l1, l2, l3) ]
Nadie dijo que tienes que usar el resultado de una lista de comprensión.