list.append()
ist die naheliegende Wahl, um am Ende einer Liste hinzuzufügen. Hier ist eine vernünftige Erklärung für das Fehlen list.prepend()
. Angenommen, meine Liste ist kurz und Leistungsbedenken sind vernachlässigbar
list.insert(0, x)
oder
list[0:0] = [x]
idiomatisch?
Wenn Sie den funktionalen Weg gehen können, ist das Folgende ziemlich klar
Natürlich haben eingefügt Sie nicht
x
inyour_list
, sondern haben Sie eine neue Liste erstellt mitx
ihm preprended.quelle
Normalerweise möchten Sie einer Liste in Python nicht wiederholt voranstellen.
Wenn es kurz ist und du es nicht viel machst ... dann ok.
list.insert
Das
list.insert
kann auf diese Weise verwendet werden.Dies ist jedoch ineffizient, da in Python a
list
ein Array von Zeigern ist und Python nun jeden Zeiger in der Liste um eins nach unten verschieben muss, um den Zeiger auf Ihr Objekt im ersten Slot einzufügen. Dies ist also wirklich nur effizient für eher kurze Listen, wie Sie fragen.Hier ist ein Ausschnitt aus der CPython-Quelle, in der dies implementiert ist. Wie Sie sehen können, beginnen wir am Ende des Arrays und verschieben bei jeder Einfügung alles um eins nach unten:
Wenn Sie einen Container / eine Liste wünschen, mit dem Elemente effizient vorangestellt werden können, möchten Sie eine verknüpfte Liste. Python hat eine doppelt verknüpfte Liste, die am Anfang und am Ende schnell eingefügt werden kann - sie heißt a
deque
.deque.appendleft
A
collections.deque
hat viele Methoden einer Liste.list.sort
ist eine Ausnahme, diedeque
Liskov definitiv nicht vollständig ersetzbar machtlist
.Das
deque
hat auch eineappendleft
Methode (sowiepopleft
). Esdeque
handelt sich um eine Warteschlange mit zwei Enden und eine doppelt verknüpfte Liste - unabhängig von der Länge dauert es immer genauso lange, bis etwas angezeigt wird. In der großen O-Notation ist O (1) gegen die O (n) -Zeit für Listen. Hier ist die Verwendung:deque.extendleft
Ebenfalls relevant ist die
extendleft
Methode der Deque , die iterativ Folgendes vorstellt:Beachten Sie, dass jedem Element ein einzelnes vorangestellt wird, wodurch die Reihenfolge effektiv umgekehrt wird.
Leistung von
list
versusdeque
Zuerst richten wir mit einem iterativen Voranstellen ein:
und Leistung:
Die Deque ist viel schneller. Wenn die Listen länger werden, würde ich erwarten, dass eine Deque noch besser abschneidet. Wenn Sie Deques verwenden können,
extendleft
erzielen Sie auf diese Weise wahrscheinlich die beste Leistung.quelle
Wenn jemand diese Frage wie ich findet, sind hier meine Leistungstests der vorgeschlagenen Methoden:
Wie Sie sehen können, ist die
insert
Slice-Zuweisung fast doppelt so schnell wie das explizite Hinzufügen und weist sehr enge Ergebnisse auf. Wie Raymond Hettinger feststellte,insert
ist dies eine häufigere Option, und ich persönlich bevorzuge diesen Weg, um der Liste voranzukommen.quelle
.insert
und[0:0] = [0]
Arbeit an Ort und Stelle , noch sie haben Neuzuweisung den gesamten Puffers.