Tengo esta lista anidada:
l = [['40', '20', '10', '30'], ['20', '20', '20', '20', '20', '30', '20'], ['30', '20', '30', '50', '10', '30', '20', '20', '20'], ['100', '100'], ['100', '100', '100', '100', '100'], ['100', '100', '100', '100']]
Ahora, lo que quiero hacer es convertir cada elemento en una lista para flotar. Mi solución es esta:
newList = []
for x in l:
for y in x:
newList.append(float(y))
Pero, ¿se puede hacer esto usando una comprensión de lista anidada, verdad?
lo que he hecho es:
[float(y) for y in x for x in l]
Pero el resultado es un montón de 100 con la suma de 2400.
Cualquier solución, una explicación sería muy apreciada. ¡Gracias!
python
list
nested
list-comprehension
Niño pasmo
fuente
fuente
Respuestas:
Así es como lo haría con una comprensión de lista anidada:
Esto le daría una lista de listas, similar a la que comenzó, excepto con flotantes en lugar de cadenas. Si quieres una lista plana, entonces la usarías
[float(y) for x in l for y in x]
.fuente
A continuación, le mostramos cómo convertir el bucle anidado para la comprensión de la lista anidada:
Así es como funciona la comprensión de la lista anidada:
Para su caso, será algo como esto.
fuente
(f(x) for x in l)
lugares la segunda línea del equivalente for-loop de la izquierda.fuente
No estoy seguro de cuál es su salida deseada, pero si está utilizando la comprensión de la lista, el orden sigue el orden de los bucles anidados, que tiene al revés. Así que obtuve lo que creo que quieres con:
El principio es: use el mismo orden que usaría al escribirlo como anidado para bucles.
fuente
Como llegué un poco tarde aquí, pero quería compartir cómo funciona realmente la comprensión de listas, especialmente la comprensión de listas anidadas:
en realidad es lo mismo que:
Y ahora la comprensión de la lista anidada:
es igual que;
salida:
fuente
Si no le gustan las comprensiones de listas anidadas, también puede utilizar la función de mapa ,
fuente
>>> float_l = [map(float, nested_list) for nested_list in l]
[[<map at 0x47be9b0>], [<map at 0x47be2e8>], [<map at 0x47be4a8>], [<map at 0x47beeb8>], [<map at 0x484b048>], [<map at 0x484b0b8>]]
pero al agregar una llamada adicional a la lista funciona como se esperaba:>>> float_l = [list(map(float, nested_list)) for nested_list in l]
python3
para devolver los generadores por falta de comprensión.Tenía un problema similar que resolver, así que me encontré con esta pregunta. Hice una comparación de rendimiento de la respuesta de Andrew Clark y Narayan que me gustaría compartir.
La principal diferencia entre dos respuestas es cómo iteran sobre las listas internas. Uno de ellos usa un mapa incorporado , mientras que otro usa la comprensión de la lista. La función de mapa tiene una ligera ventaja de rendimiento en su comprensión de lista equivalente si no requiere el uso de lambdas . Entonces, en el contexto de esta pregunta,
map
debería funcionar un poco mejor que la comprensión de la lista.Hagamos un punto de referencia de rendimiento para ver si es realmente cierto. Usé la versión 3.5.0 de Python para realizar todas estas pruebas. En el primer conjunto de pruebas, me gustaría mantener los elementos por lista en 10 y variar el número de listas de 10 a 100,000
En el siguiente conjunto de pruebas, me gustaría aumentar el número de elementos por lista a 100 .
Vamos a dar un paso valiente y modificar el número de elementos en las listas para que sea 1000
De estas pruebas podemos concluir que
map
tiene un beneficio de rendimiento sobre la comprensión de la lista en este caso. Esto también es aplicable si usted está tratando de yeso para cualquieraint
ostr
. Para un pequeño número de listas con menos elementos por lista, la diferencia es insignificante. Para listas más grandes con más elementos por lista, a uno le gustaría usar enmap
lugar de la comprensión de la lista, pero depende totalmente de las necesidades de la aplicación.Sin embargo, personalmente considero que la comprensión de la lista es más legible e idiomática que
map
. Es un estándar de facto en python. Por lo general, las personas son más competentes y cómodas (especialmente principiantes) en el uso de la comprensión de listas quemap
.fuente
Sí, puedes hacerlo con dicho código:
fuente
[float(y) for y in x for x in l]
esto daría como resultado un montón de 100 con una suma de 2400.Este problema se puede resolver sin usar for loop. El código de línea simple será suficiente para esto. El uso de Mapa anidado con la función lambda también funcionará aquí.
Y la lista de resultados sería la siguiente:
fuente
La mejor manera de hacer esto en mi opinión es usar el
itertools
paquete de Python .fuente
Sí, puedes hacer lo siguiente.
fuente
Esto se puede lograr utilizando la comprensión de la lista:
fuente