it-swarm.com.de

Funktion int () für jedes Listenelement aufrufen?

Ich habe eine Liste mit numerischen Zeichenfolgen:

numbers = ['1', '5', '10', '8'];

Ich möchte jedes Listenelement in eine Ganzzahl konvertieren, sodass es folgendermaßen aussehen würde:

numbers = [1, 5, 10, 8];

Ich könnte es mit einer Schleife machen:

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 mehr Pythonic-Wege, um dies in einer Zeile Code zu tun. Bitte hilf mir.

154
Silver Light

Dies ist, wofür Listenverständnisse sind:

numbers = [ int(x) for x in numbers ]
308
adamk

In Python 2.x verwenden Sie map :

numbers = map(int, numbers)

Hinweis: In Python 3.x gibt map ein Kartenobjekt zurück, das Sie in eine Liste konvertieren können, wenn Sie möchten:

numbers = list(map(int, numbers))
110
Mark Byers

nur ein punkt

numbers = [int(x) for x in numbers]

das Listenverständnis ist dabei natürlicher

numbers = map(int, numbers)

ist schneller. 

Wahrscheinlich spielt das in den meisten Fällen keine Rolle

Nützliche Lektüre: LP vs Karte

16
renatopp

Wenn Sie beabsichtigen, diese Ganzzahlen an eine Funktion oder Methode zu übergeben, betrachten Sie dieses Beispiel:

sum(int(x) for x in numbers)

Diese Konstruktion ähnelt absichtlich den von adamk genannten Listenverständnissen. Ohne die eckigen Klammern wird dies als generator -Ausdruck bezeichnet. Dies 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

9
Tim McNamara

Ein anderer Weg,

for i, v in enumerate(numbers): numbers[i] = int(v)
3

Ein anderer Weg, es in Python 3 zu machen:

numbers = [*map(int, numbers)]

3
Artem Zhukov

Ich dachte, ich würde die Antworten konsolidieren und einige timeit Ergebnisse zeigen.

Python 2 saugt diesbezüglich ziemlich schlecht, aber map ist etwas schneller als das Verständnis.

Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:42:59) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import timeit
>>> setup = """import random
random.seed(10)
l = [str(random.randint(0, 99)) for i in range(100)]"""
>>> timeit.timeit('[int(v) for v in l]', setup)
116.25092001434314
>>> timeit.timeit('map(int, l)', setup)
106.66044823117454

Python 3 ist über 4x schneller, aber das Konvertieren des map-Generatorobjekts in eine Liste ist noch schneller als das Verständnis. Das Erstellen der Liste durch Entpacken des map-Generators (danke Artem!) Ist noch etwas schneller.

Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 17:54:52) [MSC v.1900 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import timeit
>>> setup = """import random
random.seed(10)
l = [str(random.randint(0, 99)) for i in range(100)]"""
>>> timeit.timeit('[int(v) for v in l]', setup)
25.133059591551955
>>> timeit.timeit('list(map(int, l))', setup)
19.705547827217515
>>> timeit.timeit('[*map(int, l)]', setup)
19.45838406513076

Hinweis: In Python 3 scheinen 4 Elemente der Kreuzungspunkt (3 in Python 2) zu sein, an dem das Verständnis etwas schneller ist, obwohl das Entpacken des Generators immer noch schneller ist als bei Listen mit mehr als einem Element.

0
Jim