Ich habe eine dictionary
: Schlüssel sind Zeichenfolgen, Werte sind ganze Zahlen.
Beispiel:
stats = {'a':1000, 'b':3000, 'c': 100}
Ich würde gerne 'b'
eine Antwort bekommen, da es der Schlüssel mit einem höheren Wert ist.
Ich habe Folgendes unter Verwendung einer Zwischenliste mit umgekehrten Schlüsselwerttupeln getan:
inverse = [(value, key) for key, value in stats.items()]
print max(inverse)[1]
Ist das der bessere (oder noch elegantere) Ansatz?
python
dictionary
max
Ricafeal
quelle
quelle
max(stats)
?max(stats)
verwendet die Beschriftungen als Schlüssel (es wird zurückgegeben'c'
, vorausgesetzt, dies ist die maximale Beschriftung),max(stats, key=lambda key: stats[key])
ist das , wonach OP gesucht hat (was zurückgibt'b'
, Beschriftung mit maximalem indiziertem Wert). Ist es klarer?Antworten:
Sie können dafür verwenden
operator.itemgetter
:Und anstatt eine neue Liste im Speicher zu erstellen
stats.iteritems()
. Derkey
Parameter für diemax()
Funktion ist eine Funktion, die einen Schlüssel berechnet, mit dem bestimmt wird, wie Elemente eingestuft werden.Bitte beachten Sie, dass diese Methode nur eines der beiden zurückgibt, wenn Sie ein anderes Schlüssel-Wert-Paar 'd': 3000 haben, obwohl beide den Maximalwert haben.
Bei Verwendung von Python3:
quelle
max(stats.iterkeys(), key=(lambda key: stats[key]))
key=lambda x: x[1]
?max(stats, key=lambda key: stats[key])
quelle
stats[max(stats, key=stats.get)]
max_value = max(stats.values()); {key for key, value in stats.items() if value == max_value}
Ich habe VIELE Varianten getestet, und dies ist der schnellste Weg, um den Diktatschlüssel mit dem Maximalwert zurückzugeben:
Um Ihnen eine Vorstellung zu geben, sind hier einige Kandidatenmethoden aufgeführt:
Das Testwörterbuch:
Und die Testergebnisse unter Python 3.2:
Und unter Python 2.7:
Sie können sehen, dass dies
f1
unter Python 3.2 und 2.7 am schnellsten ist (oder ganzkeywithmaxval
oben in diesem Beitrag).quelle
f7
ist sof1
, als würde man einem Zwischenobjekt keinen Namen geben.f7
sollte (sehr leicht) schneller sein alsf1
, nicht viel langsamer. Und das bekomme ich:>>> timeit.timeit("f1()","from __main__ import f1, f7, d1", number=10000) 0.26785888786807277 >>> timeit.timeit("f7()","from __main__ import f1, f7, d1", number=10000) 0.26770628307832567
Wenn Sie nur einen Schlüssel mit dem Maximalwert kennen müssen, können Sie darauf verzichten
iterkeys
oderiteritems
weil die Iteration durch das Wörterbuch in Python eine Iteration durch die Schlüssel ist.BEARBEITEN:
Aus Kommentaren, @ user1274878:
Ja...
max
Das optionale
key
Argument beschreibt, wie Elemente verglichen werden, um das Maximum zwischen ihnen zu erzielen:Zurückgegebene Werte werden verglichen.
Dikt
Python Dict ist eine Hash-Tabelle. Ein Diktatschlüssel ist ein Hash eines als Schlüssel deklarierten Objekts. Aus Leistungsgründen Iteration durch ein Diktat als Iteration durch seine Schlüssel implementiert.
Daher können wir es verwenden, um den Vorgang des Erhaltens einer Schlüsselliste zu befreien.
Schließung
Die
stats
Variable, die über das__closure__
Attribut derlambda
Funktion als Zeiger auf den Wert der im übergeordneten Bereich definierten Variablen verfügbar ist .quelle
Beispiel:
Wenn Sie den Maximalwert mit seiner Taste ermitteln möchten, ist das Folgen möglicherweise einfach und ohne relevante Funktionen.
Die Ausgabe ist der Schlüssel mit dem Maximalwert.
quelle
Hier ist noch einer:
Die Funktion gibt
key
einfach den Wert zurück, der für das Ranking verwendet werden soll, undmax()
gibt das angeforderte Element sofort zurück.quelle
max(stats, key=lambda k: stats[k])
Wenn Ihnen der Wert egal ist (ich wäre überrascht, aber), können Sie Folgendes tun:
Ich mag das Entpacken des Tupels besser als einen [0] Index am Ende des Ausdrucks. Ich mag die Lesbarkeit von Lambda-Ausdrücken nie sehr, finde sie aber besser als den operator.itemgetter (1) IMHO.
quelle
_
könnte anstelle von verwendet werdenignored
.ignored
sieht ziemlich hässlich aus, aber einige Leute sind_
aus mehreren Gründen dagegen. Ich denke, das erste Snippet ist in Ordnung, auch wenn Sie den Wert ignorierenDa mehr als ein Eintrag den Maximalwert hat. Ich würde eine Liste der Schlüssel erstellen, deren Wert den Maximalwert hat.
Dies gibt Ihnen auch 'b' und jeden anderen Max-Schlüssel.
Hinweis: Verwenden Sie für Python 3
stats.items()
anstelle vonstats.iteritems()
quelle
max
teuer wäre (z. B. ein langes Wörterbuch), würde ich empfehlen,[key for m in [max(stats.values())] for key,val in stats.iteritems() if val == m]
wenn Sie einen Einzeiler möchten, andernfallsm = ...
vorher berechnen .Sie können verwenden:
Um den Schlüssel zurückzugeben, verwenden Sie das Wertepaar:
quelle
So erhalten Sie den maximalen Schlüssel / Wert des Wörterbuchs
stats
:>>> max(stats.items(), key = lambda x: x[0]) ('c', 100)
>>> max(stats.items(), key = lambda x: x[1]) ('b', 3000)
Wenn Sie nur den Schlüssel oder Wert aus dem Ergebnis erhalten möchten, können Sie natürlich die Tupelindizierung verwenden. Zum Beispiel, um den Schlüssel zu erhalten, der dem Maximalwert entspricht:
>>> max(stats.items(), key = lambda x: x[1])[0] 'b'
Erläuterung
Die Wörterbuchmethode
items()
in Python 3 gibt ein Ansichtsobjekt des Wörterbuchs zurück. Wenn dieses Ansichtsobjekt von dermax
Funktion durchlaufen wird, werden die Wörterbuchelemente als Tupel des Formulars ausgegeben(key, value)
.>>> list(stats.items()) [('c', 100), ('b', 3000), ('a', 1000)]
Wenn Sie den
lambda
Ausdruck verwendenlambda x: x[1]
, ist in jeder Iterationx
eines dieser Tupel(key, value)
. Wenn Sie also den richtigen Index auswählen, wählen Sie aus, ob Sie nach Schlüsseln oder nach Werten vergleichen möchten.Python 2
Für Python 2.2+ -Versionen funktioniert derselbe Code. Es ist jedoch besser, die
iteritems()
Wörterbuchmethode anstelle von zu verwendenitems()
Leistung zu verwenden.Anmerkungen
Diese Antwort basiert auf den Kommentaren zur Antwort von Climbs_lika_Spyder .
Der verwendete Code wurde unter Python 3.5.2 und Python 2.7.10 getestet.
quelle
quelle
Gemäß den iterierten Lösungen über Kommentare in der ausgewählten Antwort ...
In Python 3:
In Python 2:
quelle
Ich bin hierher gekommen, um zu suchen, wie ich
mydict.keys()
basierend auf dem Wert von zurückkehren kannmydict.values()
. Anstatt nur den einen Schlüssel zurückzugeben, wollte ich das oberste x zurückgeben Anzahl von Werten zurückgeben.Diese Lösung ist einfacher als die Verwendung der
max()
Funktion und Sie können die Anzahl der zurückgegebenen Werte leicht ändern:Wenn Sie den einzigen Schlüssel mit dem höchsten Rang möchten, verwenden Sie einfach den Index:
Wenn Sie die beiden obersten Schlüssel mit dem höchsten Rang möchten, verwenden Sie einfach das Listen-Slicing:
quelle
max()
. Es ist klar, dass es das schnellste ist. Ich dachte, ich würde eine andere Lösung mit dem Vorteil des Schneidens anbieten, was für mich damals nützlicher warMit keiner dieser Antworten war ich zufrieden.
max
wählt immer den ersten Schlüssel mit dem Maximalwert. Das Wörterbuch kann mehrere Schlüssel mit diesem Wert haben.Veröffentlichen Sie diese Antwort, falls sie jemandem hilft. Siehe den folgenden SO-Beitrag
Welches Maximum wählt Python bei einem Unentschieden?
quelle
Mit
collections.Counter
könnte man machenGegebenenfalls können Sie einfach mit einem Leerzeichen beginnen
collections.Counter
und es ergänzenquelle
Eine Heap-Warteschlange ist eine verallgemeinerte Lösung, mit der Sie die nach Wert geordneten obersten n Schlüssel extrahieren können:
Hinweis
dict.__getitem__
ist die Methode, die vom syntaktischen Zucker aufgerufen wirddict[]
. Im Gegensatz dazudict.get
wird es zurückgegeben,KeyError
wenn kein Schlüssel gefunden wird, was hier nicht vorkommen kann.quelle
max((value, key) for key, value in stats.items())[1]
quelle
+1 auf @Aric Coadys einfachste Lösung.
Und auch eine Möglichkeit, zufällig einen der Schlüssel mit maximalem Wert im Wörterbuch auszuwählen:
quelle
quelle
Wie wäre es mit:
quelle
zip(stats.keys(), stats.values())
ist nur ein längerer Weg zu schreibenstats.items()
. Sobald Sie diese Änderung vorgenommen haben, ist Ihre Antwort fast identisch mit mehreren älteren Antworten.items
ist nicht dasselbe wiezip
. Es wird nur das gleiche Ergebnis erzielt.Ich habe die akzeptierte Antwort AND @ thewolfs schnellste Lösung gegen eine sehr einfache Schleife getestet und die Schleife war schneller als beide:
Ergebnisse:
quelle
Für Benutzer von wissenschaftlichen Pythons ist hier eine einfache Lösung mit Pandas:
quelle
In dem Fall, dass Sie mehr als einen Schlüssel mit demselben Wert haben, zum Beispiel:
Sie können eine Sammlung mit allen Schlüsseln mit maximalem Wert wie folgt erhalten:
quelle
Viel einfacher zu verstehender Ansatz:
Ausgabe: ['a', 'g']
Jetzt können Sie nur noch einen Schlüssel auswählen:
quelle