Zugriff auf Elemente in Sammlungen.OrderedDict von index
Können sagen, ich habe den folgenden code ein:
import collections
d = collections.OrderedDict()
d['foo'] = 'python'
d['bar'] = 'spam'
Gibt es eine Möglichkeit, ich kann auf die Elemente in einer nummerierten Art und Weise, wie:
d(0) #foo's Output
d(1) #bar's Output
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Ihr ein
OrderedDict()
können Sie leicht Zugriff auf die Elemente von der Indizierung, indem man die Tupel von (Schlüssel,Wert) - Paare wie folgtHinweis für Python 3.X
dict.items
zurückkehren würde, ein durchsuchbar dict-Objekt anzeigen eher als eine Liste. Wir müssen wickeln Sie den Anruf auf eine Liste, um die Indizierung möglichitems
Methode gibt ein interable Wörterbuch view-Objekt eher als eine Liste, und unterstützen nicht schneiden oder indizieren. So müssten Sie drehen Sie es in eine Liste ersten. docs.python.org/3.3/library/stdtypes.html#dict-viewslist(d.items())
list(d.items())
mithilfenext(islice(d.items(), 1))
zu bekommen('bar', 'spam')
items = list(d.items())
-> ` items = Tupel(d....Elemente())`?Haben Sie verwenden, um eine OrderedDict oder Sie möchten gezielt eine Karte-wie der Typ, der ' s bestellt, die in irgendeiner Weise mit schnellem positions-Indizierung? Wenn letzteres, dann betrachten Sie eine Python ' s viele sortiert dict-Typen (die Bestellungen von Schlüssel-Wert-Paare basierend auf key sort order). Einige Implementierungen unterstützen auch die schnelle Indizierung. Zum Beispiel, die sortedcontainers Projekt hat eine SortedDict geben Sie für genau diesen Zweck.
SortedDict
mit einem Schlüssel-Funktion zu vermeiden, Vergleiche. Wie:SortedDict(lambda key: 0, ...)
. Schlüssel werden dann unsortiert, sondern bleiben auch weiterhin in einer stabilen Ordnung und sind indexiert.Hier ist ein besonderer Fall, wenn Sie wollen, dass die ersten Eintrag (oder kurz davor) in eine OrderedDict, ohne eine Liste erstellen:
(Das erste mal, wenn Sie sagen "weiter()", es wirklich bedeutet, "erste.")
In meinem informellen test in Python 2.7,
iteritems().next()
mit einem kleinen OrderedDict ist nur ein kleines bisschen schneller alsitems()[0]
. Mit einem OrderedDict von 10.000 Einträge,iteritems().next()
wurde über 200-mal schneller alsitems()[0]
.ABER wenn Sie speichern die Elemente() Liste einmal und dann verwenden Sie die Liste, eine Menge, das könnte schneller sein. Oder wenn Sie wiederholt { erstellen Sie eine iteritems() iterator und Schritt durch Sie an die gewünschte position }, das könnte langsamer sein.
OrderedDict
s nichtiteritems()
- Methode, so müssen Sie das folgende tun, um das erste Element:next(iter(d.items()))
.d.items()
scheint sich nicht um einen iterator, so iter vor wird nicht helfen? Es wird noch zurück, die komplette Liste 🙁odict_iterator
bestätigt wurde mir im IRC #python, dass dies nicht eine Kopie der Liste.Es ist dramatisch effizienter zu nutzen IndexedOrderedDict aus der
indiziert
Paket.Folgende Niklas Kommentar, ich habe eine benchmark auf OrderedDict und IndexedOrderedDict mit 1000 Einträgen.
IndexedOrderedDict ist ~100 mal schneller im index-Elemente an bestimmten position, in diesem speziellen Fall.
indexed.py
stattindexed
.Dieser community wiki versucht zu sammeln, bereits vorhandene Antworten.
Python 2.7
In python 2 die
keys()
,values()
, unditems()
FunktionenOrderedDict
Gegenzug Listen. Mitvalues
als ein Beispiel, ist der einfachste WegFür große Sammlungen, wenn Sie nur über einen einzigen index, können Sie vermeiden, erstellen Sie die vollständige Liste über den generator Versionen
iterkeys
,itervalues
unditeritems
:Den indexed.py Paket bietet
IndexedOrderedDict
, die speziell für diesen Anwendungsfall und wird die Schnellste option.Mit itervalues können deutlich schneller für große Wörterbücher mit random access:
Python 3.6
Python 3 hat die gleichen grundlegenden Optionen (Liste vs generator), aber die dict-Methoden zurück, Generatoren standardmäßig.
Liste Methode:
Generator-Methode:
Python 3 Wörterbücher sind um eine Größenordnung schneller als die python 2 und haben ähnliche Beschleunigungen für die Verwendung von Generatoren.
Es ist eine neue ära und mit Python 3.6.1 Wörterbücher behalten jetzt Ihre Bestellung. Diese Semantik nicht explizit, weil das verlangen würde, dass BDFL-Zulassung. Aber Raymond Hettinger ist die nächste beste Sache (und Lustiger) und er macht einen ziemlich starke Fall Wörterbücher, die bestellt wird, für eine sehr lange Zeit.
So, jetzt ist es einfach zu erstellen Scheiben ein Wörterbuch:
Hinweis: Dictonary einführen-um die Erhaltung ist jetzt offizielle Python-3.7.
für OrderedDict() können Sie den Zugriff auf die Elemente von der Indizierung, indem man die Tupel von (Schlüssel,Wert) - Paare wie folgt, oder mit '.Werte()'