Ich frage mich, wie ich das erste Element jeder Unterliste in einer Liste von Listen am besten extrahieren und an eine neue Liste anhängen kann. Also wenn ich habe:
lst = [[a,b,c], [1,2,3], [x,y,z]]
und ich möchte herausziehen a
, 1
und , x
und erstellen Sie eine separate Liste von denen.
Ich habe es versucht:
lst2.append(x[0] for x in lst)
Antworten:
Mit Liste Verständnis :
quelle
Sie könnten zip verwenden:
Oder Python 3, wo
zip
keine Liste erstellt wird:Oder,
Oder (mein Favorit) benutze numpy:
quelle
list
oder verwendennext
. DankeHatte das gleiche Problem und wurde neugierig auf die Leistung jeder Lösung.
Hier ist das
%timeit
:Der erste numpy-Weg, der das Array transformiert:
Vollständig nativ mit Listenverständnis (wie von @alecxe erklärt):
Eine andere native Methode
zip
(wie von @dawg erklärt):Zweiter numpy-Weg. Auch erklärt von @dawg:
Überraschenderweise (zumindest für mich) ist der native Weg mit Listenverständnis der schnellste und etwa 10x schneller als der Numpy-Weg. Das Ausführen der beiden Numpy-Wege ohne das Finale
list
spart ungefähr ein µs, was immer noch im 10- fachen Unterschied liegt.Beachten Sie, dass
len
das Timing gleich blieb , wenn ich jedes Code-Snippet mit einem Aufruf an umgab , um sicherzustellen, dass Generatoren bis zum Ende laufen.quelle
Python enthält eine Funktion namens itemgetter, um das Element an einem bestimmten Index in einer Liste zurückzugeben:
Übergeben Sie der Funktion itemgetter () den Index des Elements, das Sie abrufen möchten. Um das erste Element abzurufen, verwenden Sie itemgetter (0). Es ist wichtig zu verstehen, dass itemgetter (0) selbst eine Funktion zurückgibt. Wenn Sie dieser Funktion eine Liste übergeben, erhalten Sie das spezifische Element:
Dies ist nützlich, wenn Sie es mit map () kombinieren, das eine Funktion als erstes Argument und eine Liste (oder eine andere iterierbare Funktion) als zweites Argument verwendet. Es gibt das Ergebnis des Aufrufs der Funktion für jedes Objekt in der iterablen Datei zurück:
Beachten Sie, dass map () einen Generator zurückgibt, sodass das Ergebnis an list () übergeben wird, um eine aktuelle Liste zu erhalten. Zusammenfassend könnte Ihre Aufgabe folgendermaßen erledigt werden:
Dies ist eine alternative Methode zur Verwendung eines Listenverständnisses. Welche Methode in hohem Maße ausgewählt werden muss, hängt vom Kontext, der Lesbarkeit und den Vorlieben ab.
Weitere Informationen: https://docs.python.org/3/library/operator.html#operator.itemgetter
quelle
Ihr Code ist fast korrekt. Das einzige Problem ist die Verwendung des Listenverständnisses.
Wenn Sie wie folgt verwenden: (x [0] für x in lst), wird ein Generatorobjekt zurückgegeben. Wenn Sie Folgendes verwenden: [x [0] für x in lst], wird eine Liste zurückgegeben.
Wenn Sie die Ausgabe des Listenverständnisses an eine Liste anhängen, ist die Ausgabe des Listenverständnisses das einzelne Element der Liste.
lst2 = [['a', 1, 'x']]
lst2 [0] = ['a', 1, 'x']
Bitte lassen Sie mich wissen, wenn ich falsch bin.
quelle
Ausgabe:
['a', 1, 'x']
quelle
Sie sagten, dass Sie eine vorhandene Liste haben. Also werde ich damit weitermachen.
Im Moment hängen Sie das Generatorobjekt an Ihre zweite Liste an.
Aber Sie möchten wahrscheinlich, dass es eine Liste der ersten Elemente ist
Jetzt haben wir die Liste der ersten Elemente an die vorhandene Liste angehängt. Wenn Sie die Elemente themenbezogen und nicht als Liste zu den vorhandenen Elementen hinzufügen möchten, verwenden Sie list.extend. In diesem Fall müssen wir uns keine Gedanken über das Hinzufügen eines Generators machen, da Extend diesen Generator verwendet, um jedes Element hinzuzufügen, das es von dort erhält, um die aktuelle Liste zu erweitern.
oder
https://docs.python.org/3.4/tutorial/datastructures.html#more-on-lists https://docs.python.org/3.4/tutorial/datastructures.html#list-comprehensions
quelle
append
in der Frage Verwirrung verursacht. Es hört sich so an, als ob er / sie einfach den Teil des Listenverständnisses Ihrer Lösung haben möchte.