Ich habe eine Liste mit numerischen Zeichenfolgen, wie folgt:
numbers = ['1', '5', '10', '8'];
Ich möchte jedes Listenelement in eine Ganzzahl konvertieren, damit es so aussieht:
numbers = [1, 5, 10, 8];
Ich könnte es mit einer Schleife machen, wie folgt:
new_numbers = [];
for n in numbers:
new_numbers.append(int(n));
numbers = new_numbers;
Muss es so hässlich sein? Ich bin sicher, es gibt eine pythonischere Möglichkeit, dies in einer Codezeile zu tun. Bitte hilf mir.
Antworten:
Dafür sind Listenverständnisse gedacht :
quelle
In Python 2.x besteht ein anderer Ansatz darin, Folgendes zu verwenden
map
:Hinweis: In Python 3.x wird
map
ein Kartenobjekt zurückgegeben, das Sie bei Bedarf in eine Liste konvertieren können:quelle
map
einen Iterator anstelle einer Liste zurück, sodass er so geschrieben werden muss, alslist(map(int, numbers))
ob eine Liste benötigt wird.map
hat einen höheren Einrichtungsaufwand, aber auf dem Referenzinterpreter hat die Transformationsfunktion, wenn es sich um eine in C implementierte Python-Funktion handelt, niedrigere Kosten pro Element. Das Testen mit einer Eingabe von nur vier Werten liefert keine nützlichen Informationen zur Skalierung. Das heißt, in meinen eigenen Tests (auf Py2.7.12 und Py3.5.2, letzteres mitlist()
Wrapping) hat Py2map
sogar für vier Elementeingaben gewonnen und auf Py3 nur einen winzigen Vorsprung verloren; Ich vermute, Ihre Tests wurden zugunsten von Listcomps verzerrt.nur ein Punkt,
Das Listenverständnis ist dabei natürlicher
ist schneller.
Wahrscheinlich spielt dies in den meisten Fällen keine Rolle
Nützliche Lektüre: LP vs Karte
quelle
Wenn Sie diese Ganzzahlen an eine Funktion oder Methode übergeben möchten, betrachten Sie dieses Beispiel:
Diese Konstruktion ist absichtlich bemerkenswert ähnlich den von Adamk erwähnten Listenverständnissen. Ohne die eckigen Klammern wird es als Generatorausdruck bezeichnet und ist eine sehr speichereffiziente Methode, um eine Liste von Argumenten an eine Methode zu übergeben. Eine gute Diskussion finden Sie hier: Generatorausdrücke vs. Listenverständnis
quelle
Eine andere Möglichkeit, es in Python 3 zu schaffen:
numbers = [*map(int, numbers)]
quelle
[]
, eine Argumentliste genommen zu haben . Und ich wusste nicht, dass Sie einen Iterator als Argumentliste übergeben können. Ich hätte gedacht zu tunnumber = list(map(int, numbers))
. Aber danke für die Erklärung!Ein anderer Weg,
quelle
Ich dachte, ich würde die Antworten konsolidieren und einige
timeit
Ergebnisse zeigen .Python 2 ist ziemlich schlecht darin, aber es
map
ist ein bisschen schneller als das Verstehen.Python 3 ist an sich mehr als viermal schneller, aber das Konvertieren des
map
Generatorobjekts in eine Liste ist immer noch schneller als das Verstehen, und das Erstellen der Liste durch Entpacken desmap
Generators (danke Artem!) Ist noch etwas schneller.Hinweis: In Python 3 scheinen 4 Elemente der Übergangspunkt zu sein (3 in Python 2), an dem das Verständnis etwas schneller ist, obwohl das Entpacken des Generators immer noch schneller ist als bei Listen mit mehr als 1 Element.
quelle