varios una posicion misma lista eliminar elementos elemento comparar cambiar agregar python list

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