Wenn dies der OrderedDict()
Fall ist, können Sie einfach auf die Elemente zugreifen, indem Sie sie indizieren, indem Sie die Tupel von (Schlüssel-, Wert-) Paaren wie folgt abrufen
>>> import collections
>>> d = collections.OrderedDict()
>>> d['foo'] = 'python'
>>> d['bar'] = 'spam'
>>> d.items()
[('foo', 'python'), ('bar', 'spam')]
>>> d.items()[0]
('foo', 'python')
>>> d.items()[1]
('bar', 'spam')
Hinweis für Python 3.X.
dict.items
würde ein iterierbares Diktatansichtsobjekt anstelle einer Liste zurückgeben. Wir müssen den Aufruf in eine Liste einschließen, um die Indizierung zu ermöglichen
>>> items = list(d.items())
>>> items
[('foo', 'python'), ('bar', 'spam')]
>>> items[0]
('foo', 'python')
>>> items[1]
('bar', 'spam')
items
Methode in 3.x ein interaktives Wörterbuchansichtsobjekt anstelle einer Liste zurückgibt und kein Slicing oder Indizieren unterstützt. Sie müssten es also zuerst in eine Liste umwandeln. docs.python.org/3.3/library/stdtypes.html#dict-viewslist(d.items())
list(d.items())
indem Sie verwendennext(islice(d.items(), 1))
, um('bar', 'spam')
Müssen Sie ein OrderedDict verwenden oder möchten Sie speziell einen kartenähnlichen Typ, der in irgendeiner Weise mit schneller Positionsindizierung geordnet ist? Wenn letzteres der Fall ist, betrachten Sie einen der vielen sortierten Diktattypen von Python (der Schlüssel-Wert-Paare basierend auf der Sortierreihenfolge der Schlüssel sortiert). Einige Implementierungen unterstützen auch die schnelle Indizierung. Zu diesem Zweck verfügt das sortedcontainers- Projekt beispielsweise über einen SortedDict- Typ.
quelle
SortedDict
eine Schlüsselfunktion verwenden, um Vergleiche zu vermeiden. Wie :SortedDict(lambda key: 0, ...)
. Die Schlüssel werden dann unsortiert, bleiben jedoch in einer stabilen Reihenfolge und sind indizierbar.Hier ist ein Sonderfall, wenn Sie den ersten Eintrag (oder einen ähnlichen Eintrag) in einem OrderedDict wünschen, ohne eine Liste zu erstellen. (Dies wurde auf Python 3 aktualisiert):
(Wenn Sie zum ersten Mal "next ()" sagen, bedeutet dies wirklich "first".)
In meinem informellen Test ist
next(iter(d.items()))
mit einem kleinen OrderedDict nur ein kleines bisschen schneller alsitems()[0]
. Mit einem OrderedDict von 10.000 Einträgennext(iter(d.items()))
war das etwa 200-mal schneller alsitems()[0]
.ABER wenn Sie die Liste items () einmal speichern und die Liste dann häufig verwenden, kann dies schneller sein. Oder wenn Sie wiederholt {einen items () - Iterator erstellen und ihn an die gewünschte Position bringen}, kann dies langsamer sein.
quelle
OrderedDict
s haben keineiteritems()
Methode, daher müssen Sie Folgendes tun, um das erste Element zu erhalten :next(iter(d.items()))
.d.items()
scheint es kein Iterator zu sein, also hilft der Iter vor nicht? Es wird immer noch die vollständige Liste zurückgegeben :(odict_iterator
und wurde mir im IRC #python bestätigt, dass dies keine Kopie der Liste erstellt.Die Verwendung von IndexedOrderedDict aus dem
indexed
Paket ist erheblich effizienter .Nach Niklas 'Kommentar habe ich einen Benchmark für OrderedDict und IndexedOrderedDict mit 1000 Einträgen durchgeführt.
IndexedOrderedDict ist in diesem speziellen Fall ~ 100-mal schneller bei der Indizierung von Elementen an einer bestimmten Position.
quelle
indexed.py
stattdessen zu installierenindexed
.Dieses Community-Wiki versucht, vorhandene Antworten zu sammeln.
Python 2.7
In Python 2, das
keys()
,values()
unditems()
Funktionen derOrderedDict
Rückkehr Listen. Amvalues
einfachsten ist es am BeispielFür große Sammlungen , wo man nur über einen einzigen Index kümmern, können Sie vermeiden , um die vollständige Liste der Erstellung der Generator - Versionen verwenden,
iterkeys
,itervalues
unditeritems
:Das Paket indexed.py bietet
IndexedOrderedDict
, das für diesen Anwendungsfall entwickelt wurde und die schnellste Option ist.Die Verwendung von itervalues kann für große Wörterbücher mit wahlfreiem Zugriff erheblich schneller sein:
Python 3.6
Python 3 hat die gleichen zwei grundlegenden Optionen (Liste gegen Generator), aber die dict-Methoden geben standardmäßig Generatoren zurück.
Listenmethode:
Generatormethode:
Python 3-Wörterbücher sind um eine Größenordnung schneller als Python 2 und haben ähnliche Beschleunigungen für die Verwendung von Generatoren.
quelle
Es ist eine neue Ära und mit Python 3.6.1 behalten Wörterbücher jetzt ihre Reihenfolge bei. Diese Semantik ist nicht explizit, da dies eine BDFL-Genehmigung erfordern würde. Aber Raymond Hettinger ist das nächstbeste (und witzigere) und er macht ein ziemlich starkes Argument dafür, dass Wörterbücher für eine sehr lange Zeit bestellt werden.
So ist es jetzt einfach, Slices eines Wörterbuchs zu erstellen:
Hinweis: Die Beibehaltung der diktonaren Einfügereihenfolge ist jetzt in Python 3.7 offiziell .
quelle
Für OrderedDict () können Sie auf die Elemente zugreifen, indem Sie sie indizieren, indem Sie die Tupel von (Schlüssel-, Wert-) Paaren wie folgt abrufen oder '.values ()' verwenden.
quelle