Ich frage mich, warum der Standard list
in Python keine Methoden shift
, unshift
hat. Vielleicht gibt es einen offensichtlichen Grund dafür, wie die Listen im Speicher angeordnet sind.
Im Moment weiß ich, dass ich mit append ein Element am Ende einer Liste hinzufügen und löschen kann, um ein Element zu entfernen. Allerdings kann ich die Listenverkettung nur verwenden, um das Verhalten einer fehlenden Methode shift
oder unshift
zu imitieren.
Habe ich etwas verpasst?
Python-Listen wurden für schnelle Operationen mit fester Länge optimiert und verursachen O (n) Speicherbewegungskosten für Operationen pop(0)
und insert(0, v)
, die sowohl die Größe als auch die Position der zugrunde liegenden Datendarstellung ändern.
Sie könnten stattdessen an collections.deque
interessiert sein, was eine Liste ist - wie Container mit schnellen Anhängen und Pops an jedem Ende.
Deques unterstützen thread-sichere, speichereffiziente Anhängen und Pops von jeder Seite der Deque mit ungefähr derselben O (1) -Leistung in beiden Richtungen. Die fehlenden Methoden, nach denen Sie zu fragen scheinen, werden unter den Namen appendleft
und popleft
:
Natürlich gibt es einen Kompromiss, und Indexierung oder Einfügen / Entfernen in der Nähe der Mitte der Deque ist langsam. Tatsächlich war deque.insert(index, object)
nicht einmal vor Python 3.5 möglich, Sie müssten rotieren, Einfügen / Pop und Drehen zurück. Sie verlieren auch Slicing, also wenn Sie benötigt, dass Sie etwas lästiges mit z. itertools.islice
stattdessen.
Weitere Informationen zu den Vor- und Nachteilen von deque
vs list
Datenstrukturen finden Sie unter Wie werden Deques in Python implementiert? und wann sind sie schlechter als Listen?