204 votes

Comment diviser chaque élément dans une liste par un entier ?

Je veux simplement diviser chaque élément d'une liste par un entier.

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 trouver de solution.

J'ai é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]

EDIT:

Le code suivant me donne le résultat attendu :

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

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

299voto

soulcheck Points 17680

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 avez besoin de conserver la référence à la liste d'origine :

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

1 votes

Étant donné une taille de liste statique, l'un de ces méthodes serait-elle plus rapide que [mylist[0]/myint,mylist[1]/myint]

9 votes

@user1938107 presque certainement pas, mais c'est aussi le type de micro-optimisation que vous devriez éviter de toute façon.

98voto

silvado Points 2156

La façon dont vous avez essayé en premier lieu 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 effectuez de telles opérations avec de longues listes et surtout dans n'importe quel projet de calcul scientifique, je vous conseille vivement d'utiliser numpy.

8 votes

Je sais que cette réponse est ancienne mais pour 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 flottant. Sinon, diviser par 3 vous donnerait juste 3 comme résultat au lieu de 3.333...

3 votes

@RichardBoonen dans ce cas, l'OP voulait faire une division entière, mais si vous voulez faire une division à virgule flottante, vous avez raison, vous devez spécifier le type à numpy. Ou ajoutez un seul flottant dans la liste: numpy.array([10.,20,30,40,50,60,70,80,90])

28voto

Dogbert Points 44003
>>> maListe = [10,20,30,40,50,60,70,80,90]
>>> monInt = 10
>>> nouvelleListe = map(lambda x: x/monInt, maListe)
>>> nouvelleListe
[1, 2, 3, 4, 5, 6, 7, 8, 9]

1 votes

Penses-tu que la technique de map est meilleure que la compréhension de listes dans ce cas ? Je me demande car j'aurais choisi la compréhension de listes, car c'est plus facile à lire.

0 votes

@AndrewCox Je préfère map (venant d'un background non python). La compréhension de liste me semble aussi plus propre, donc tu devrais probablement choisir cela.

0 votes

Est-ce que vous savez si c'est plus rapide que la solution postée par soulcheck et berkantk ?

15voto

Armin Points 171

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)

11voto

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X