Como você divide cada elemento de uma lista por um int?


154

Eu só quero dividir cada elemento em uma lista por um int.

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

Este é o erro:

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

Entendo por que estou recebendo esse erro. Mas estou frustrado por não encontrar uma solução.

Também tentei:

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

Erro:

ValueError: too many values to unpack

Resultado esperado:

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


EDITAR:

O código a seguir me fornece o resultado esperado:

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

Mas existe uma maneira mais fácil / rápida de fazer isso?

Respostas:


233

A maneira idiomática seria usar a compreensão da lista:

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

ou, se você precisar manter a referência à lista original:

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

1
dado um tamanho lista estática, que qualquer um destes métodos de ser mais rápido do que [mylist [0] / myint, mylist [1] / myint]
user-2147482637

7
@ user1938107 quase certamente não, mas esse também é o tipo de micro otimização que você deve evitar de qualquer maneira.
soulcheck

75

A maneira como você tentou primeiro é realmente diretamente possível com o numpy :

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

Se você fizer essas operações com listas longas e, especialmente, em qualquer tipo de projeto de computação científica, eu realmente recomendaria o uso de numpy.


4
Sei que essa é uma resposta antiga, mas para quem ainda está lendo: lembre-se de que ao usar o numpy.array, você deve especificar o tipo, por exemplo, numpy.array([10,20,30,40,50,60,70,80,90], dtype='f')para loat. Caso contrário, dividir por 3 daria a você apenas 3 como resultado, em vez de 3.333 ..
Richard Boonen

3
@RichardBoonen, neste caso, o OP queria fazer a divisão int, mas se você quiser fazer a divisão flutuante, está certo, precisará especificar o tipo para numpy. Ou coloque uma única bóia na lista:numpy.array([10.,20,30,40,50,60,70,80,90])
silvado 2/17/17

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]

Você acha que o mapa é melhor do que a compreensão da lista nesse caso? Estou apenas me perguntando como eu teria ido para a compreensão da lista, pois é mais fácil de ler.
Andrew Cox

@AndrewCox Eu prefiro o mapa (vindo de um fundo não python). A compreensão da lista parece ser mais clara para mim também, então você provavelmente deve concordar com isso.
23411 Dogbert

Você sabe se isso é mais rápido do que a solução soulcheck e berkantk postadas?
Casa

@Casa: alguém testou isso em stackoverflow.com/q/1247490 . A conclusão parece ser que a compreensão da lista vence, nesse caso em particular.
23711 Brian

4
Atualmente, map()retorna um objeto de mapa, portanto, se você deseja uma lista, precisa explicitamente dizer list(). Portanto, neste 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

A versão abstrata pode 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)]

Você poderia escrever mais curto?
E.Coms
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.