Betrachten Sie das folgende Wörterbuch, d:
d = {'a': 3, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
Ich möchte die ersten N Schlüssel: Wert-Paare von d zurückgeben (in diesem Fall N <= 4). Was ist die effizienteste Methode dafür?
python
dictionary
Jason Strimpel
quelle
quelle
list(d.items())[:4]
. list () ist die zugrunde liegende Implementierung für viele der Antworten.Antworten:
Es gibt keine "ersten n" Tasten, da a
dict
sich nicht daran erinnert, welche Tasten zuerst eingefügt wurden.Sie können jedoch n beliebige Schlüssel-Wert-Paare erhalten:
Dies nutzt die Implementierung von
take
aus denitertools
Rezepten :Sehen Sie, wie es online funktioniert: ideone
Update für Python 3.6
quelle
iteritems
sollte durchitems
für Leute auf Python 3 ersetzt werdentake()
irgendwo ein Teil der Python-Codebasis? Oder ist es nur die Funktion, die Sie in Ihrer Antwort hier definiert haben? Wenn ich frage, ob es Teil der Codebasis ist, kann ich es nicht finden / importieren. :)Eine sehr effiziente Möglichkeit, etwas abzurufen, besteht darin, das Verständnis von Listen oder Wörterbüchern mit dem Schneiden zu kombinieren. Wenn Sie die Artikel nicht bestellen müssen (Sie möchten nur n zufällige Paare), können Sie ein Wörterbuchverständnis wie das folgende verwenden:
Im Allgemeinen ist ein solches Verständnis immer schneller auszuführen als die entsprechende Schleife "für x in y". Wenn Sie mit .keys () eine Liste der Wörterbuchschlüssel erstellen und diese Liste aufteilen, vermeiden Sie außerdem, dass Sie beim Erstellen des neuen Wörterbuchs unnötige Schlüssel berühren.
Wenn Sie die Schlüssel (nur die Werte) nicht benötigen, können Sie ein Listenverständnis verwenden:
Wenn Sie die Werte nach ihren Schlüsseln sortieren müssen, ist das kein Problem mehr:
oder wenn Sie auch die Schlüssel benötigen:
quelle
Pythons
dict
sind nicht bestellt, daher ist es sinnlos, nach den "ersten N" -Tasten zu fragen.Die
collections.OrderedDict
Klasse ist verfügbar, wenn Sie dies benötigen. Sie könnten die ersten vier Elemente effizient als erhaltenitertools.islice
Mit dieser Option können Sie träge Elemente aus jedem Iterator entfernen. Wenn Sie möchten, dass das Ergebnis wiederverwendbar ist, müssen Sie es in eine Liste oder ähnliches konvertieren:quelle
Verwandeln Sie die Ansicht (dict_items) in einen Iterator und iterieren Sie sie dann mit next ().
quelle
Habe es hier nicht gesehen. Wird nicht bestellt, sondern syntaktisch am einfachsten, wenn Sie nur einige Elemente aus einem Wörterbuch entnehmen müssen.
quelle
TypeError: 'dict_items' object is not subscriptable
{key:value for key,value in stocks.items()[0:n]}
(Aktien ist der Name meines Wörterbuchs)Um die Top-N-Elemente aus Ihrem Python-Wörterbuch zu erhalten, können Sie die folgende Codezeile verwenden:
In Ihrem Fall können Sie Folgendes ändern:
quelle
Siehe PEP 0265 zum Sortieren von Wörterbüchern. Verwenden Sie dann den oben genannten iterierbaren Code.
Wenn Sie mehr Effizienz bei den sortierten Schlüssel-Wert-Paaren benötigen. Verwenden Sie eine andere Datenstruktur. Das heißt, eine, die die sortierte Reihenfolge und die Schlüsselwertzuordnungen beibehält.
Z.B
quelle
In py3 reicht dies aus
{'a': 3, 'b': 2, 'c': 3, 'd': 4}
quelle
füge einfach eine Antwort mit zip hinzu,
quelle
Dies hängt davon ab, was in Ihrem Fall am effizientesten ist.
Wenn Sie nur eine halbzufällige Stichprobe eines riesigen Wörterbuchs
foo
verwenden möchten , verwendenfoo.iteritems()
und verwenden Sie so viele Werte, wie Sie benötigen. Dies ist eine verzögerte Operation, bei der die Erstellung einer expliziten Liste von Schlüsseln oder Elementen vermieden wird.Wenn Sie zuerst Schlüssel sortieren müssen, führt kein Weg daran vorbei,
keys = foo.keys(); keys.sort()
odersorted(foo.iterkeys())
Sie müssen eine explizite Liste von Schlüsseln erstellen. Dann schneiden oder durchlaufen ersten Nkeys
.Übrigens, warum interessiert Sie der "effiziente" Weg? Haben Sie Ihr Programm profiliert? Wenn Sie dies nicht getan haben, verwenden Sie zuerst den offensichtlichen und leicht verständlichen Weg. Die Chancen stehen gut, dass es ziemlich gut läuft, ohne zu einem Engpass zu werden.
quelle
Sie können dies auf verschiedene Arten angehen. Wenn die Reihenfolge wichtig ist, können Sie dies tun:
Wenn die Bestellung kein Problem darstellt, können Sie dies tun:
quelle
value
eher nennen alsitem
aus Gründen der Klarheit.Das Wörterbuch behält keine Reihenfolge bei. Bevor Sie also die ersten N Schlüsselwertpaare auswählen, können Sie es sortieren.
Jetzt können wir die obersten 'N'-Elemente abrufen: Mit der folgenden Methodenstruktur:
Um die Top 2 Elemente zu erhalten, verwenden Sie einfach diese Struktur:
quelle
Wählen Sie für Python 3 und höher zuerst n Paare aus
quelle
Betrachten Sie ein Diktat
islice wird den Trick machen :) hoffe es hilft!
quelle
Das mag nicht sehr elegant sein, funktioniert aber für mich:
quelle
Ich habe einige der obigen Antworten ausprobiert und festgestellt, dass einige davon versionabhängig sind und in Version 3.7 nicht funktionieren.
Ich stelle auch fest, dass seit 3.6 alle Wörterbücher nach der Reihenfolge geordnet sind, in der Elemente eingefügt werden.
Obwohl Wörterbücher seit 3.6 bestellt wurden, scheinen einige der Anweisungen, die Sie für geordnete Strukturen erwarten, nicht zu funktionieren.
Die Antwort auf die OP-Frage, die für mich am besten funktioniert hat.
quelle
lst = list(d.items())[:N]