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


154

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é recibo 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?

Respuestas:


233

La forma idiomática sería utilizar la comprensión de la lista:

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]

1
dado un tamaño de lista estática, cualquiera de estos métodos sería más rápido que [mylist [0] / myint, mylist [1] / myint]
user-2147482637

77
@ user1938107 casi seguro que no, pero este es también el tipo de micro optimización que debes evitar de todos modos.
soulcheck

75

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

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

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


44
Sé que esta es una respuesta anterior, 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')para loat. De lo contrario, dividir por 3 le daría solo 3 como resultado en lugar de 3.333 ..
Richard Boonen

3
@RichardBoonen en este caso, el OP quería hacer una división int, pero si quieres hacer una división flotante, tienes razón, tienes que especificar el tipo de numpy. O ponga una sola carroza en la lista:numpy.array([10.,20,30,40,50,60,70,80,90])
silvado

24
>>> 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 la lista en este caso? Me pregunto cómo habría ido para la comprensión de la lista, ya que es más fácil de leer.
Andrew Cox

@ AndrewCox Prefiero el mapa (proveniente de un fondo que no es de Python). La comprensión de la lista también parece ser más limpia para mí, por lo que probablemente debería ir con eso.
Dogbert

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

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

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

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

6

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)

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

¿Podrías escribir más corto?
E.Coms
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.