Come dividi ogni elemento in un elenco per un int?


154

Voglio solo dividere ogni elemento in un elenco per un int.

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

Questo è l'errore:

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

Capisco perché ricevo questo errore. Ma sono frustrato di non riuscire a trovare una soluzione.

Ho anche provato:

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

Errore:

ValueError: too many values to unpack

Risultato atteso:

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


MODIFICARE:

Il seguente codice mi dà il risultato atteso:

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

Ma c'è un modo più semplice / veloce per farlo?

Risposte:


234

Il modo idiomatico sarebbe usare la comprensione dell'elenco:

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

oppure, se è necessario mantenere il riferimento all'elenco originale:

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

1
data una dimensione dell'elenco statico, uno di questi metodi sarebbe più veloce di [mylist [0] / myint, mylist [1] / myint]
user-2147482637

7
@ user1938107 quasi certamente no, ma questo è anche il tipo di micro ottimizzazione che dovresti evitare comunque.
soulcheck

75

Il modo in cui hai provato prima è in realtà direttamente possibile con numpy :

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

Se si eseguono tali operazioni con lunghi elenchi e soprattutto in qualsiasi tipo di progetto di calcolo scientifico, consiglierei davvero di usare numpy.


4
So che questa è una vecchia risposta, ma per chiunque ancora la legga: tieni presente che quando usi numpy.array dovresti specificare il tipo, ad esempio, numpy.array([10,20,30,40,50,60,70,80,90], dtype='f')per loat. Altrimenti la divisione per 3 ti darebbe solo 3 come risultato invece di 3.333 ..
Richard Boonen

3
@RichardBoonen in questo caso l'OP voleva fare la divisione int, ma se vuoi fare la divisione float, hai ragione, devi specificare il tipo da intorpidire. Oppure inserisci un singolo float nell'elenco: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]

Pensi che la mappa sia migliore della comprensione dell'elenco in questo caso? Mi sto solo chiedendo come avrei cercato la comprensione dell'elenco, poiché è più facile da leggere.
Andrew Cox,

@AndrewCox Preferisco la mappa (proveniente da uno sfondo non python). Anche la comprensione dell'elenco sembra essere più pulita per me, quindi probabilmente dovresti andare con quello.
Dogbert,

Sai se questo è più veloce della soluzione soulcheck e berkantk pubblicata?
Casa

@Casa: qualcuno l'ha provato su stackoverflow.com/q/1247490 . La conclusione sembra essere che la comprensione dell'elenco vince, in questo caso particolare.
Brian,

4
Oggi map()restituisce un oggetto mappa, quindi se vuoi un elenco devi dire esplicitamente list(). Quindi in questo 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

La versione astratta può essere:

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)]

Potresti scrivere più breve?
E.Coms
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.