Comment divisez-vous chaque élément d'une liste par un entier?

154

Je veux juste diviser chaque élément d'une liste par un int.

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

Voici l'erreur:

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

Je comprends pourquoi je reçois cette erreur. Mais je suis frustré de ne pas pouvoir trouver de solution.

Également essayé:

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

Erreur:

ValueError: too many values to unpack

Résultat attendu:

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


ÉDITER:

Le code suivant me donne mon résultat attendu:

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

Mais y a-t-il un moyen plus simple / plus rapide de le faire?

Casa
la source

Réponses:

234

La manière idiomatique serait d'utiliser la compréhension de liste:

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

ou, si vous devez conserver la référence à la liste d'origine:

myList[:] = [x / myInt for x in myList]
soulcheck
la source
1
étant donné une taille de liste statique, l'une de ces méthodes serait-elle plus rapide que [mylist [0] / myint, mylist [1] / myint]
user-2147482637
7
@ user1938107 presque certainement pas, mais c'est aussi le genre de micro-optimisation que vous devriez éviter de toute façon.
soulcheck
75

La façon dont vous avez essayé le premier est en fait directement possible avec numpy :

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

Si vous faites de telles opérations avec de longues listes et en particulier dans tout type de projet de calcul scientifique, je vous conseillerais vraiment d'utiliser numpy.

silvado
la source
4
Je sais que c'est une vieille réponse, mais pour tous ceux qui la lisent encore: gardez à l'esprit que lorsque vous utilisez numpy.array, vous devez spécifier le type par exemple numpy.array([10,20,30,40,50,60,70,80,90], dtype='f')pour loat. Sinon, diviser par 3 vous donnerait seulement 3 comme résultat au lieu de 3.333 ..
Richard Boonen
3
@RichardBoonen dans ce cas, l'OP voulait faire une division int, mais si vous voulez faire une division flottante, vous avez raison, vous devez spécifier le type à numpy. Ou mettez un seul flotteur dans la liste: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
la source
Pensez-vous que la carte est meilleure que la compréhension de liste dans ce cas? Je me demande simplement comme je le ferais pour la compréhension de la liste, car c'est plus facile à lire.
Andrew Cox
@AndrewCox Je préfère la carte (venant d'un arrière-plan non python). La compréhension de la liste me semble aussi plus propre, vous devriez donc probablement y aller.
Dogbert
Savez-vous si cela est plus rapide que la solution soulcheck et berkantk publiée?
Casa
@Casa: Quelqu'un a testé cela sur stackoverflow.com/q/1247490 . La conclusion semble être que les compréhensions de listes gagnent, dans ce cas particulier.
Brian
4
De nos jours, map()renvoie un objet de carte, donc si vous voulez une liste, vous devez le dire explicitement list(). Donc dans ce cas: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
la source
6

La version abstraite peut être:

import numpy as np
myList = [10, 20, 30, 40, 50, 60, 70, 80, 90]
myInt = 10
newList  = np.divide(myList, myInt)
Armin
la source
0
myInt=10
myList=[tmpList/myInt for tmpList in range(10,100,10)]
Richard
la source
Pourriez-vous écrire plus court?
E.Coms