python - una - ¿Llamar a la función int() en cada elemento de la lista?
plot title python (7)
De otra manera,
for i, v in enumerate(numbers): numbers[i] = int(v)
Tengo una lista con cadenas numéricas, así:
numbers = [''1'', ''5'', ''10'', ''8''];
Me gustaría convertir cada elemento de 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 forma más pitonica de hacer esto en una línea de código. Por favor, ayúdame.
En Python 2.x otro enfoque es usar el map
:
numbers = map(int, numbers)
Nota: en Python 3.x map
devuelve un objeto de mapa que puede convertir a una lista si lo desea:
numbers = list(map(int, numbers))
Esto es para lo que son las listas de comprensión:
numbers = [ int(x) for x in numbers ]
Otra forma de hacerlo en Python 3:
numbers = [*map(int, numbers)]
Pensé que consolidaría las respuestas y mostraría algunos resultados de tiempo.
Python 2 es bastante malo en esto, pero el map
es un poco más rápido que la comprensión.
Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:42:59) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import timeit
>>> setup = """import random
random.seed(10)
l = [str(random.randint(0, 99)) for i in range(100)]"""
>>> timeit.timeit(''[int(v) for v in l]'', setup)
116.25092001434314
>>> timeit.timeit(''map(int, l)'', setup)
106.66044823117454
Python 3 es más de 4 veces más rápido por sí mismo, pero convertir el objeto del generador de map
en una lista es aún más rápido que la comprensión, y crear la lista desempacando el generador de map
(¡gracias Artem!) Es aún más rápido.
Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 17:54:52) [MSC v.1900 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import timeit
>>> setup = """import random
random.seed(10)
l = [str(random.randint(0, 99)) for i in range(100)]"""
>>> timeit.timeit(''[int(v) for v in l]'', setup)
25.133059591551955
>>> timeit.timeit(''list(map(int, l))'', setup)
19.705547827217515
>>> timeit.timeit(''[*map(int, l)]'', setup)
19.45838406513076
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 para listas con más de 1 elemento.
Si tiene la intención de pasar esos enteros a una función o método, considere este ejemplo:
sum(int(x) for x in numbers)
Esta construcción es intencionalmente notablemente similar a las comprensiones listadas por adamk. Sin los corchetes, se denomina expresión de generador , y es una forma muy eficiente de 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
solo un punto,
numbers = [int(x) for x in numbers]
la lista de comprensión es más natural, mientras que
numbers = map(int, x)
es más rápido.
Probablemente esto no importe en la mayoría de los casos
Lectura útil: LP vs map