Wie teilt man jedes Element in einer Liste durch ein int?

153

Ich möchte nur jedes Element in einer Liste durch ein int teilen.

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

Dies ist der Fehler:

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

Ich verstehe, warum ich diesen Fehler erhalte. Aber ich bin frustriert, dass ich keine Lösung finden kann.

Auch versucht:

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

Error:

ValueError: too many values to unpack

Erwartetes Ergebnis:

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


BEARBEITEN:

Der folgende Code gibt mir mein erwartetes Ergebnis:

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

Aber gibt es einen einfacheren / schnelleren Weg, dies zu tun?

Casa
quelle

Antworten:

231

Der idiomatische Weg wäre, das Listenverständnis zu verwenden:

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

oder, wenn Sie den Verweis auf die ursprüngliche Liste beibehalten müssen:

myList[:] = [x / myInt for x in myList]
Soulcheck
quelle
1
Bei einer statischen Listengröße wäre eine dieser Methoden schneller als [mylist [0] / myint, mylist [1] / myint]
user-2147482637
7
@ user1938107 mit ziemlicher Sicherheit nicht, aber dies ist auch die Art der Mikrooptimierung, die Sie sowieso vermeiden sollten.
Soulcheck
74

Die Art und Weise, wie Sie es zuerst versucht haben, ist mit numpy direkt möglich :

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

Wenn Sie solche Operationen mit langen Listen und insbesondere in einem wissenschaftlichen Computerprojekt durchführen, würde ich die Verwendung von numpy wirklich empfehlen.

Silvado
quelle
4
Ich weiß, dass dies eine alte Antwort ist, aber für alle, die sie noch lesen: Denken Sie daran, dass Sie bei der Verwendung von numpy.array den Typ beispielsweise numpy.array([10,20,30,40,50,60,70,80,90], dtype='f')für loat angeben sollten. Andernfalls würde das Teilen durch 3 nur 3 als Ergebnis anstelle von 3,333 ergeben.
Richard Boonen
3
@RichardBoonen In diesem Fall wollte das OP eine int-Division durchführen, aber wenn Sie eine float-Division durchführen möchten, haben Sie Recht, Sie müssen den Typ für numpy angeben. Oder setzen Sie einen einzelnen Schwimmer in die 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
quelle
Denken Sie, dass Map in diesem Fall besser ist als Listenverständnis? Ich frage mich nur, wie ich zum Verständnis der Liste gegangen wäre, da es einfacher zu lesen ist.
Andrew Cox
@ AndrewCox Ich bevorzuge Map (kommt aus einem Nicht-Python-Hintergrund). Das Listenverständnis scheint mir auch sauberer zu sein, also sollten Sie wahrscheinlich damit weitermachen.
Dogbert
Weißt du, ob dies schneller ist als die Lösung Soulcheck und Berkantk?
Casa
@Casa: Jemand hat dies unter stackoverflow.com/q/1247490 getestet . Die Schlussfolgerung scheint zu sein, dass das Listenverständnis in diesem speziellen Fall gewinnt.
Brian
4
Heutzutage wird map()ein Kartenobjekt zurückgegeben. Wenn Sie also eine Liste möchten, müssen Sie dies explizit angeben list(). Also in diesem Fall:newList = list(map(lambda x: x/myInt, myList))
robertmartin8
8
myList = [10,20,30,40,50,60,70,80,90]
myInt = 10
newList = [i/myInt for i in myList]
NotCamelCase
quelle
6

Die abstrakte Version kann sein:

import numpy as np
myList = [10, 20, 30, 40, 50, 60, 70, 80, 90]
myInt = 10
newList  = np.divide(myList, myInt)
Armin
quelle
0
myInt=10
myList=[tmpList/myInt for tmpList in range(10,100,10)]
Richard
quelle
Könnten Sie kürzer schreiben?
E.Coms