Python: key bekommen mit dem geringsten Wert aus einem Wörterbuch, SONDERN mehrere minimum-Werte
Ich versuche, das gleiche zu tun wie
Erhalten Sie die entsprechende Taste, um den minimalen Wert in einem Wörterbuchwo wir Sie haben wollen, bekommen Sie die entsprechende Taste, um den minimalen Wert in einem Wörterbuch.
Der beste Weg zu sein scheint:
min(d, key=d.get)
ABER ich möchte diese auf ein Wörterbuch mit mehreren minimalen Werte:
d = {'a' : 1, 'b' : 2, 'c' : 1}
Beachten Sie, dass die Antwort von den oben genannten wäre:
>>> min(d, key=d.get)
'a'
Allerdings muss ich beide die zwei Tasten, die einen minimalen Wert, nämlich a
und c
.
Was wäre die beste Herangehensweise?
(Letztendlich möchte ich wählen Sie eine der zwei nach dem Zufallsprinzip, aber ich glaube nicht, dass dies relevant ist).
InformationsquelleAutor der Frage gozzilli | 2012-03-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine einfache Möglichkeit ist es, zuerst bestimmen Sie den minimalen Wert an, und wählen Sie dann alle Schlüssel-mapping auf, dass minimum:
Für Python 3 verwenden
d.values()
stattd.itervalues()
.Dieser benötigt zwei Durchläufe durch das Wörterbuch, sollte aber eine der schnellsten Möglichkeiten, dies zu tun sowieso.
Mit reservoir samplingdie Sie implementieren können, ein single-pass-Ansatz, der wählt einen der Gegenstände nach dem Zufallsprinzip:
Nach dem schreiben unten dieser code, ich glaube, diese option ist von eher theoretischem Interesse... 🙂
InformationsquelleAutor der Antwort Sven Marnach
oder leicht optimiert
Es ist nicht so effizient als andere Lösungen, sondern zeigt die Schönheit von python (naja, mich zumindest).
InformationsquelleAutor der Antwort georg
BEARBEITET: Jetzt mit setdefault wie vorgeschlagen 🙂
Ich weiß nicht, ob das hilft, aber du aufbauen könntest einen reverse dictionary mit den Werten als Schlüssel und den Schlüssel (in einer Liste als Werte).
Gedruckt:
Aber ich denke, die anderen Lösungen sind kompakter und wahrscheinlich auch eleganter...
InformationsquelleAutor der Antwort katzenversteher
InformationsquelleAutor der Antwort inspectorG4dget
Können Sie heapq.nsmallest, um die N kleinsten Mitglieder der dict, dann filtern alle, die nicht gleich dem niedrigsten ein. Das ist vorausgesetzt, Sie wissen, die maximale Anzahl der kleinsten Mitglieder, die Sie haben kann, nehmen wir an, es ist N hier. so etwas wie:
InformationsquelleAutor der Antwort Not_a_Golfer
Wegen Ihrer Semantik müssen Sie gehen durch das gesamte Wörterbuch, mindestens einmal. Dieser ruft genau 1 minimale element.
Wenn Sie möchten, dass alle minimalen Elemente in O(log(N)), query Zeit, Sie können zum einfügen eines elements in eine Warteschlange, wie Sie ist, erzeugen Sie (wenn Sie können). Die Priorität muss haben O(1) einfügen Zeit und O(log(N)), extract-min Zeit. (Das wird so schlimm, wie Sortieren, wenn alle Ihre Elemente den gleichen Wert haben, aber ansonsten kann Sie ganz gut funktionieren.)
InformationsquelleAutor der Antwort ninjagecko
One-pass-Lösung wäre:
InformationsquelleAutor der Antwort Bogdan
Hier ist ein weiterer Weg, es zu tun in einem Durchgang:
InformationsquelleAutor der Antwort alan
Dies funktioniert:
Hmpf. Nach dem fixieren bis der code funktioniert, ich landete mit @Sven Marnach Antwort, so ignorieren Sie diese 😉
InformationsquelleAutor der Antwort Daren Thomas