¿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?

Casa
fuente

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]
verificación del alma
fuente
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.

silvado
fuente
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]
Dogbert
fuente
¿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]
NotCamelCase
fuente
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)
Armin
fuente
0
myInt=10
myList=[tmpList/myInt for tmpList in range(10,100,10)]
Ricardo
fuente
¿Podrías escribir más corto?
E.Coms