compressed - list comprehension python for
¿Cómo combino una matriz 2D en Python en una cadena con List Comprehension? (8)
Al igual que:
[ item for innerlist in outerlist for item in innerlist ]
Pasando eso directamente a una cadena con separadores:
'',''.join(str(item) for innerlist in outerlist for item in innerlist)
Sí, el orden de ''para la lista interna en la lista externa'' y ''para el elemento en la lista interna'' es correcto. Aunque el "cuerpo" del bucle está al principio de la listacomp, el orden de los bucles anidados (y las cláusulas ''if'') sigue siendo el mismo que cuando se escribe el bucle:
for innerlist in outerlist:
for item in innerlist:
...
La comprensión de la lista para mí parece ser como el bloque opaco de granito que las expresiones regulares son para mí. Necesito punteros.
Diga, tengo una lista 2D:
li = [[0,1,2],[3,4,5],[6,7,8]]
Me gustaría fusionar esto en una larga lista
li2 = [0,1,2,3,4,5,6,7,8]
o en una cadena con separadores:
s = "0,1,2,3,4,5,6,7,8"
Realmente, me gustaría saber cómo hacer ambas cosas.
Hay un par de elecciones. En primer lugar, puede crear una lista nueva y agregarle el contenido de cada lista:
li2 = []
for sublist in li:
li2.extend(sublist)
Alternativamente, puede usar la itertools
de chain
del módulo itertools
, que produce un iterable que contiene todos los elementos en múltiples iterables:
import itertools
li2 = list(itertools.chain(*li))
Si toma este enfoque, puede producir la cadena sin crear una lista intermedia:
s = ",".join(itertools.chain(*li))
Para el segundo, hay un método de cadena incorporado para hacer eso:
>>> print '',''.join(str(x) for x in li2)
"0,1,2,3,4,5,6,7,8"
Para el primero, puede usar join dentro de una lista de comprensión:
>>> print ",".join([",".join(str(x) for x in li])
"0,1,2,3,4,5,6,7,8"
Pero es más fácil de usar itertools.flatten:
>>> import itertools
>>> print itertools.flatten(li)
[0,1,2,3,4,5,6,7,8]
>>> print ",".join(str(x) for x in itertools.flatten(li))
"0,1,2,3,4,5,6,7,8"
NB: itertools es un módulo que te ayuda a manejar tareas comunes con iteradores como listas, tuplas o cadenas ... Es práctico porque no almacena una copia de la estructura en la que estás trabajando, pero procesa los elementos uno a uno .
EDITAR: gracioso, estoy aprendiendo muchas formas de hacerlo. ¿Quién dijo que solo había una buena manera de hacerlo?
Para que sea una lista aplanada, use:
Luego, join
para hacer una cadena.
Trata eso:
li=[[0,1,2],[3,4,5],[6,7,8]]
li2 = [ y for x in li for y in x]
Puedes leerlo así:
Dame la lista de todos los ys.
Los ys vienen del xs.
Los xs vienen de li.
Para mapear eso en una cadena:
'',''.join(map(str,li2))
import itertools
itertools.flatten( li )
Hay muchas formas de hacer este problema. Me gustan las herramientas de Numpy porque normalmente ya se importan en todo lo que hago. Sin embargo, si no está utilizando Numpy para nada más, probablemente este no sea un buen método.
import numpy
li = [[0,1,2],[3,4,5],[6,7,8]]
li2=li[0] #first element of array to merge
i=1
while i<len(li):
li2=numpy.concatenate((li2,li[i]))
i+=1
print li2
Esto imprimirá [0 1 2 3 4 5 6 7 8] y luego puede convertir esto en su cadena también.
Mi favorito, y el más corto, es este:
li2 = sum(li, [])
y
s = '',''.join(li2)
EDITAR: use la sum
lugar de reduce
, (gracias Thomas Wouters !)