Warum hat Pythons Liste keine Shift / Unshift-Methoden? [geschlossen]

8

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.

%Vor%

Habe ich etwas verpasst?

    
nowox 10.12.2015, 20:18
quelle

1 Antwort

17

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 :

%Vor%

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?

    
wim 10.12.2015, 20:50
quelle

Tags und Links