Tengo una lista con cadenas numéricas, así:
numbers = ['1', '5', '10', '8'];
Me gustaría convertir cada elemento de la lista a entero, por lo que se vería así:
numbers = [1, 5, 10, 8];
Podría hacerlo usando un bucle, así:
new_numbers = [];
for n in numbers:
new_numbers.append(int(n));
numbers = new_numbers;
¿Tiene que ser tan feo? Estoy seguro de que hay una manera más pitónica de hacer esto en una línea de código. Por favor, ayúdame.
Respuestas:
Para eso están las comprensiones de listas :
fuente
En Python 2.x otro enfoque es usar
map
:Nota: en Python 3.x
map
devuelve un objeto de mapa que puede convertir a una lista si lo desea:fuente
map
devuelve un iterador en lugar de una lista, por lo que debe escribirse comolist(map(int, numbers))
si se necesitara una lista.map
tiene una sobrecarga de configuración más alta, pero en el intérprete de referencia, si la función de transformación es una función incorporada de Python implementada en C, tiene un costo por artículo más bajo. Las pruebas en una entrada de solo cuatro valores no proporcionarán información útil sobre la escala. Dicho esto, en mis propias pruebas (en Py2.7.12 y Py3.5.2, esta última conlist()
envoltura), Py2map
ganó incluso para entradas de cuatro elementos, y pierde solo por un pequeño margen en Py3; Sospecho que sus pruebas fueron deformadas a favor de listcomps.solo un punto
la comprensión de la lista es más natural, mientras que
es más rápido.
Probablemente esto no importará en la mayoría de los casos
Lectura útil: LP vs mapa
fuente
Si tiene la intención de pasar esos enteros a una función o método, considere este ejemplo:
Esta construcción es intencionalmente notablemente similar a las comprensiones de listas mencionadas por adamk. Sin los corchetes, se llama una expresión generadora , y es una forma muy eficiente en la memoria de pasar una lista de argumentos a un método. Una buena discusión está disponible aquí: Expresiones del generador vs. Comprensión de la lista
fuente
Otra forma de hacerlo en Python 3:
numbers = [*map(int, numbers)]
fuente
[]
tomado una lista de argumentos. Y, no sabía que podría pasar un iterador como una lista de argumentos. Hubiera pensado hacernumber = list(map(int, numbers))
. Pero gracias por la explicación!De otra manera,
fuente
Pensé en consolidar las respuestas y mostrar algunos
timeit
resultados.Python 2 apesta bastante mal en esto, pero
map
es un poco más rápido que la comprensión.Python 3 es 4 veces más rápido por sí mismo, pero convertir el
map
objeto generador en una lista es aún más rápido que la comprensión, y crear la lista desempacando elmap
generador (¡gracias Artem!) Es aún más rápido.Nota: En Python 3, 4 elementos parecen ser el punto de cruce (3 en Python 2) donde la comprensión es un poco más rápida, aunque desempacar el generador es aún más rápido que cualquiera de las listas con más de 1 elemento.
fuente