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?

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]

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.


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]

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]

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)

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

Pourriez-vous écrire plus court?
E.Coms
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.