Ich habe diese verschachtelte Liste:
l = [['40', '20', '10', '30'], ['20', '20', '20', '20', '20', '30', '20'], ['30', '20', '30', '50', '10', '30', '20', '20', '20'], ['100', '100'], ['100', '100', '100', '100', '100'], ['100', '100', '100', '100']]
Jetzt möchte ich jedes Element in einer Liste in float konvertieren. Meine Lösung lautet:
newList = []
for x in l:
for y in x:
newList.append(float(y))
Aber kann dies mit dem Verständnis verschachtelter Listen geschehen, oder?
Was ich getan habe ist:
[float(y) for y in x for x in l]
Aber dann ist das Ergebnis ein Haufen von 100 mit der Summe von 2400.
Jede Lösung, eine Erklärung wäre sehr dankbar. Vielen Dank!
python
list
nested
list-comprehension
Junge Pasmo
quelle
quelle
Antworten:
So würden Sie dies mit einem verschachtelten Listenverständnis tun:
Dies würde Ihnen eine Liste von Listen geben, ähnlich wie Sie mit Ausnahme von Floats anstelle von Strings begonnen haben. Wenn Sie eine flache Liste möchten, würden Sie verwenden
[float(y) for x in l for y in x]
.quelle
So konvertieren Sie verschachtelte for-Schleifen in verschachtelte Listen:
So funktioniert das Verständnis verschachtelter Listen:
Für Ihren Fall wird es so etwas sein.
quelle
(f(x) for x in l)
stellenweise die zweite Zeile des for-loop-Äquivalents links steht.quelle
Sie sind sich nicht sicher, welche Ausgabe Sie wünschen, aber wenn Sie das Listenverständnis verwenden, folgt die Reihenfolge der Reihenfolge der verschachtelten Schleifen, die Sie rückwärts haben. Also habe ich das bekommen, von dem ich denke, dass du es willst:
Das Prinzip lautet: Verwenden Sie dieselbe Reihenfolge, in der Sie sie als verschachtelt für Schleifen ausschreiben würden.
quelle
Da ich hier etwas spät dran bin, wollte ich aber mitteilen, wie das Listenverständnis tatsächlich funktioniert, insbesondere das verschachtelte Listenverständnis:
ist eigentlich das gleiche wie:
Und jetzt verschachteltes Listenverständnis:
ist das gleiche wie;
Ausgabe:
quelle
Wenn Sie das Verständnis verschachtelter Listen nicht mögen, können Sie auch die Kartenfunktion verwenden.
quelle
>>> float_l = [map(float, nested_list) for nested_list in l]
[[<map at 0x47be9b0>], [<map at 0x47be2e8>], [<map at 0x47be4a8>], [<map at 0x47beeb8>], [<map at 0x484b048>], [<map at 0x484b0b8>]]
>>> float_l = [list(map(float, nested_list)) for nested_list in l]
python3
, um Generatoren aus dem Verständnis zurückzugeben.Ich hatte ein ähnliches Problem zu lösen und bin auf diese Frage gestoßen. Ich habe einen Leistungsvergleich der Antwort von Andrew Clark und Narayan durchgeführt, den ich gerne teilen möchte.
Der Hauptunterschied zwischen zwei Antworten besteht darin, wie sie über innere Listen iterieren. Einer von ihnen verwendet eine integrierte Karte , während der andere das Listenverständnis verwendet. Die Kartenfunktion hat einen leichten Leistungsvorteil gegenüber dem entsprechenden Listenverständnis, wenn keine Lambdas verwendet werden müssen . Im Zusammenhang mit dieser Frage
map
sollte also etwas besser abschneiden als das Listenverständnis.Machen wir einen Leistungsbenchmark, um zu sehen, ob er tatsächlich wahr ist. Ich habe Python Version 3.5.0 verwendet, um all diese Tests durchzuführen. In der ersten Testreihe möchte ich die Anzahl der Elemente pro Liste auf 10 halten und die Anzahl der Listen von 10 bis 100.000 variieren
In den nächsten Tests möchte ich die Anzahl der Elemente pro Liste auf 100 erhöhen .
Machen wir einen mutigen Schritt und ändern Sie die Anzahl der Elemente in Listen auf 1000
Aus diesem Test können wir schließen, dass
map
in diesem Fall ein Leistungsvorteil gegenüber dem Listenverständnis besteht. Dies gilt auch, wenn Sie versuchen, entwederint
oder zu übertragenstr
. Bei einer kleinen Anzahl von Listen mit weniger Elementen pro Liste ist der Unterschied vernachlässigbar. Für größere Listen mit mehr Elementen pro Liste möchte man möglicherweisemap
anstelle des Listenverständnisses verwenden, dies hängt jedoch vollständig von den Anwendungsanforderungen ab.Ich persönlich finde das Listenverständnis jedoch lesbarer und idiomatischer als
map
. Es ist ein De-facto-Standard in Python. Normalerweise beherrschen die Leute das Listenverständnis besser und besser (besonders Anfänger) alsmap
.quelle
Ja, Sie können es mit einem solchen Code tun:
quelle
[float(y) for y in x for x in l]
Dies würde zu einem Haufen von 100 mit einer Summe von 2400 führen.Dieses Problem kann ohne Verwendung der for-Schleife gelöst werden. Hierfür ist ein einziger Zeilencode ausreichend. Die Verwendung der verschachtelten Karte mit der Lambda-Funktion funktioniert auch hier.
Die Ausgabeliste wäre wie folgt:
quelle
Der beste Weg, dies zu tun, ist meiner Meinung nach die Verwendung des Python-
itertools
Pakets.quelle
Ja, Sie können Folgendes tun.
quelle
Dies kann durch Listenverständnis erreicht werden:
quelle