Letztes Element in OrderedDict

Ich habe den Typ OrderedDict . Ich möchte auf das zuletzt hinzugefügte (Schlüssel-, Wert-) Paar zugreifen. od.popitem(last = True) würde es tun, aber würde auch das Paar von od entfernen, was ich nicht will

Was ist ein guter Weg, das zu tun? Kann ich das machen:

 class MyOrderedDict(OrderedDict): def last(self): return next(reversed(self)) 

3 Solutions collect form web for “Letztes Element in OrderedDict”

Die next(reversed(od)) ist eine perfekte Möglichkeit, auf das zuletzt hinzugefügte Element zuzugreifen. Die Klasse OrderedDict verwendet eine doppelt verknüpfte Liste für die Wörterbuchelemente und implementiert __reversed__() , so dass diese Implementierung Ihnen O (1) Zugriff auf das gewünschte Element gibt. Ob es sich lohnt, die Unterklasse OrderedDict() für diese einfache Bedienung zu OrderedDict() kann aber in Frage gestellt werden.

Eine kleine magie von timeit kann hier helfen …

 from collections import OrderedDict class MyOrderedDict1(OrderedDict): def last(self): k=next(reversed(self)) return (k,self[k]) class MyOrderedDict2(OrderedDict): def last(self): out=self.popitem() self[out[0]]=out[1] return out class MyOrderedDict3(OrderedDict): def last(self): k=(list(self.keys()))[-1] return (k,self[k]) if __name__ == "__main__": from timeit import Timer N=100 d1=MyOrderedDict1() for i in range(N): d1[i]=i print ("d1",d1.last()) d2=MyOrderedDict2() for i in range(N): d2[i]=i print ("d2",d2.last()) d3=MyOrderedDict3() for i in range(N): d3[i]=i print("d3",d3.last()) t=Timer("d1.last()",'from __main__ import d1') print ("OrderedDict1",t.timeit()) t=Timer("d2.last()",'from __main__ import d2') print ("OrderedDict2",t.timeit()) t=Timer("d3.last()",'from __main__ import d3') print ("OrderedDict3",t.timeit()) 

Ergebnisse in:

 d1 (99, 99) d2 (99, 99) d3 (99, 99) OrderedDict1 1.159217119216919 OrderedDict2 3.3667118549346924 OrderedDict3 24.030261993408203 

(Getestet auf python3.2, Ubuntu Linux).

Wie von @SvenMarnach darauf hingewiesen, ist die Methode, die Sie beschrieben haben, sehr effizient im Vergleich zu den anderen zwei Möglichkeiten, die ich kochen könnte.

Ihre Idee ist gut, aber der Standard-Iterator ist nur über die Tasten, also wird Ihr Beispiel nur die letzte Taste zurückgeben. Was Sie eigentlich wollen, ist:

 class MyOrderedDict(OrderedDict): def last(self): return list(self.items())[-1] 

Das gibt die (key, value) Paare, nicht nur die Schlüssel, wie du wolltest.

Beachten Sie, dass auf Pre-3.x-Versionen von Python, OrderedDict.items() eine Liste zurückgibt, also brauchst du nicht den list() OrderedDict.items() , aber spätere Versionen geben ein Wörterbuch-View-Objekt zurück , also wirst du.

Bearbeiten: Wie in den Kommentaren erwähnt, ist die schnellere Bedienung zu tun:

 class MyOrderedDict(OrderedDict): def last(self): key = next(reversed(self)) return (key, self[key]) 

Obwohl ich zugeben muss, dass ich das hässlich in dem Code finde (ich habe es gern niemals geholfen, den Schlüssel zu machen, um den Wert separat zu bekommen, ich ziehe es vor, das (key, value) Tupel zu bekommen – je nach der Wichtigkeit der Geschwindigkeit und Ihre Vorlieben, können Sie die vorherige Option auswählen.

  • Die eingebaute API-Django-Dokumentation zeigt nichts an
  • So ändern Sie die QMenuBar in PyQt4 für ein 4K-Display
  • TypeError: module .__ init __ () nimmt höchstens 2 argumente (3 gegeben)
  • FileNotFoundError: [WinError 2] python 3.4
  • Python CSV - Listenindex außerhalb des Bereichs
  • "Busfehler: 10" beim Versuch, den Pandas-Spaltennamen einzustellen
  • Python-Modul 'os' hat kein Attribut 'mknod'
  • EC2-Instanzname mit Boto 3 anzeigen
  • Warum gibt es "Ausbeute" in einem Generator Ausdruck Ausbeute `Keine` s?
  • Python3.3 matplotlib kann den Namen _tkagg nicht importieren
  • Zip-Liste der Tupel mit flacher Liste
  • Python ist die beste Programmiersprache der Welt.