¿Cómo se divide cada elemento de una lista por un int?

4 minutos de lectura

avatar de usuario
Casa

Solo quiero dividir cada elemento en una lista por un int.

myList = [10,20,30,40,50,60,70,80,90]
myInt = 10
newList = myList/myInt

Este es el error:

TypeError: unsupported operand type(s) for /: 'list' and 'int'

Entiendo por qué estoy recibiendo este error. Pero estoy frustrado porque no puedo encontrar una solución.

También probé:

newList = [ a/b for a, b in (myList,myInt)]

Error:

ValueError: too many values to unpack

Resultado Esperado:

newList = [1,2,3,4,5,6,7,8,9]

EDITAR:

El siguiente código me da mi resultado esperado:

newList = []
for x in myList:
    newList.append(x/myInt)

Pero, ¿hay una manera más fácil/rápida de hacer esto?

avatar de usuario
control del alma

La forma idiomática sería usar la comprensión de listas:

myList = [10,20,30,40,50,60,70,80,90]
myInt = 10
newList = [x / myInt for x in myList]

o, si necesita mantener la referencia a la lista original:

myList[:] = [x / myInt for x in myList]

  • dado un tamaño de lista estático, ¿sería alguno de estos métodos más rápido que [mylist[0]/miint,milista[1]/miint]

    – usuario-2147482637

    2 de marzo de 2015 a las 3:42

  • @ user1938107 es casi seguro que no, pero este también es el tipo de microoptimización que debe evitar de todos modos.

    – examen de alma

    2 de marzo de 2015 a las 8:43

avatar de usuario
silvado

La forma en que lo intentó primero es en realidad directamente posible con entumecido:

import numpy
myArray = numpy.array([10,20,30,40,50,60,70,80,90])
myInt = 10
newArray = myArray/myInt

Si realiza este tipo de operaciones con listas largas y especialmente en cualquier tipo de proyecto de computación científica, realmente recomendaría usar numpy.

  • Sé que esta es una respuesta antigua, pero para cualquiera que todavía la lea: tenga en cuenta que cuando use numpy.array debe especificar el tipo, por ejemplo numpy.array([10,20,30,40,50,60,70,80,90], dtype='f')por lote. De lo contrario, dividir por 3 te daría solo 3 como resultado en lugar de 3.333..

    – Richard Boonen

    31 de julio de 2017 a las 11:52

  • @RichardBoonen en este caso, el OP quería hacer una división int, pero si quiere hacer una división flotante, tiene razón, debe especificar el tipo en numpy. O ponga un solo flotador en la lista: numpy.array([10.,20,30,40,50,60,70,80,90])

    – silvado

    2 de agosto de 2017 a las 18:53

>>> myList = [10,20,30,40,50,60,70,80,90]
>>> myInt = 10
>>> newList = map(lambda x: x/myInt, myList)
>>> newList
[1, 2, 3, 4, 5, 6, 7, 8, 9]

  • ¿Crees que el mapa es mejor que la comprensión de listas en este caso? Solo me pregunto si hubiera optado por la comprensión de listas, ya que es más fácil de leer.

    – Andrew Cox

    23 de noviembre de 2011 a las 15:44

  • @AndrewCox Prefiero el mapa (procedente de un fondo que no sea python). La comprensión de la lista también me parece más clara, por lo que probablemente deberías seguir con eso.

    – Dogberto

    23 de noviembre de 2011 a las 15:46

  • ¿Sabes si esto es más rápido que la solución publicada por soulcheck y berkantk?

    – Casa

    23 de noviembre de 2011 a las 15:55

  • @Casa: Alguien probó esto en stackoverflow.com/q/1247490. La conclusión parece ser que las listas de comprensión ganan, en este caso particular.

    – Brian

    23 de noviembre de 2011 a las 16:15


  • Hoy en día map() devuelve un objeto de mapa, por lo que si desea una lista, debe decir explícitamente list(). Así que en este caso: newList = list(map(lambda x: x/myInt, myList))

    – lagrange103

    13 de mayo de 2017 a las 1:10

avatar de usuario
Armín

La versión abstracta puede ser:

import numpy as np
myList = [10, 20, 30, 40, 50, 60, 70, 80, 90]
myInt = 10
newList  = np.divide(myList, myInt)

myList = [10,20,30,40,50,60,70,80,90]
myInt = 10
newList = [i/myInt for i in myList]

avatar de usuario
Suraj Rao

myInt=10
myList=[tmpList/myInt for tmpList in range(10,100,10)]

Estaba ejecutando algunas de las respuestas para ver cuál es la forma más rápida para un gran número. Entonces, descubrí que podemos convertir el int en una matriz y puede dar los resultados correctos y es más rápido.

  arrayint=np.array(myInt)
  newList = myList / arrayint

Esto un comparación de todas las respuestas anteriores

import numpy as np
import time
import random
myList = random.sample(range(1, 100000), 10000)
myInt = 10
start_time = time.time()
arrayint=np.array(myInt)
newList = myList / arrayint
end_time = time.time()
print(newList,end_time-start_time)
start_time = time.time()
newList = np.array(myList) / myInt
end_time = time.time()
print(newList,end_time-start_time)
start_time = time.time()
newList = [x / myInt for x in myList]
end_time = time.time()
print(newList,end_time-start_time)
start_time = time.time()
myList[:] = [x / myInt for x in myList]
end_time = time.time()
print(newList,end_time-start_time)
start_time = time.time()
newList = map(lambda x: x/myInt, myList)
end_time = time.time()
print(newList,end_time-start_time)
start_time = time.time()
newList = [i/myInt for i in myList]
end_time = time.time()
print(newList,end_time-start_time)
start_time = time.time()
newList  = np.divide(myList, myInt)
end_time = time.time()
print(newList,end_time-start_time)
start_time = time.time()
newList  = np.divide(myList, myInt)
end_time = time.time()
print(newList,end_time-start_time)

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad