web-dev-qa-db-de.com

Ruft den Schlüssel ab, der dem Mindestwert in einem Wörterbuch entspricht

Wie bekomme ich bei einem Python-Wörterbuch den Schlüssel zu dem Eintrag, der den Mindestwert enthält?

Ich habe über etwas nachgedacht, das mit der Funktion min() zu tun hat ...

In Anbetracht der Eingabe:

{320:1, 321:0, 322:3}

Es würde 321 zurückgeben.

220
tjvr

Am besten: min(d, key=d.get) - kein Grund, eine nutzlose lambda-Umleitungsschicht einzufügen oder Elemente oder Schlüssel zu extrahieren!

431
Alex Martelli

Hier ist eine Antwort, die der OP tatsächlich die Lösung gibt:

>>> d = {320:1, 321:0, 322:3}
>>> d.items()
[(320, 1), (321, 0), (322, 3)]
>>> # find the minimum by comparing the second element of each Tuple
>>> min(d.items(), key=lambda x: x[1]) 
(321, 0)

Die Verwendung von d.iteritems() ist jedoch für größere Wörterbücher effizienter.

40
Mark Rushakoff

min(d.items(), key=lambda x: x[1])[0]

10
abyx

Für den Fall, dass Sie mehrere Minimalschlüssel haben und es einfach halten möchten

def minimums(some_dict):
    positions = [] # output variable
    min_value = float("inf")
    for k, v in some_dict.items():
        if v == min_value:
            positions.append(k)
        if v < min_value:
            min_value = v
            positions = [] # output variable
            positions.append(k)

    return positions

minimums({'a':1, 'b':2, 'c':-1, 'd':0, 'e':-1})

['e', 'c']
6
netskink
>>> d = {320:1, 321:0, 322:3}
>>> min(d, key=lambda k: d[k]) 
321
5

Wenn Sie nicht sicher sind, dass Sie nicht mehrere Mindestwerte haben, würde ich vorschlagen:

d = {320:1, 321:0, 322:3, 323:0}
print ', '.join(str(key) for min_value in (min(d.values()),) for key in d if d[key]==min_value)

"""Output:
321, 323
"""
4

Für mehrere Schlüssel mit gleichem niedrigsten Wert können Sie ein Listenverständnis verwenden:

d = {320:1, 321:0, 322:3, 323:0}

minval = min(d.values())
res = [k for k, v in d.items() if v==minval]

[321, 323]

Eine äquivalente Funktionsversion:

res = list(filter(lambda x: d[x]==minval, d))
3
jpp

Edit: Dies ist eine Antwort auf die Frage des OPs original über den Minimalschlüssel, nicht die Minimalantwort.


Sie können die Schlüssel des Diktats mit der Funktion keys abrufen. Sie können also mit min das Minimum der Liste ermitteln.

3
perimosocordiae

Ein weiterer Ansatz, um die Ausgabe mehrerer Schlüssel mit dem gleichen Mindestwert zu behandeln:

>>> dd = {320:1, 321:0, 322:3, 323:0}
>>>
>>> from itertools import groupby
>>> from operator import itemgetter
>>>
>>> print [v for k,v in groupby(sorted((v,k) for k,v in dd.iteritems()), key=itemgetter(0)).next()[1]]
[321, 323]
3
PaulMcG

Verwenden Sie min mit einem Iterator (für Python 3 verwenden Sie items anstelle von iteritems); Verwenden Sie anstelle von Lambda den Operator itemgetter, der schneller als Lambda ist.

from operator import itemgetter
min_key, _ = min(d.iteritems(), key=itemgetter(1))
2
Antti Haapala
d={}
d[320]=1
d[321]=0
d[322]=3
value = min(d.values())
for k in d.keys(): 
    if d[k] == value:
        print k,d[k]

Ich habe die Leistung der folgenden drei Optionen verglichen:

    import random, datetime

myDict = {}
for i in range( 10000000 ):
    myDict[ i ] = random.randint( 0, 10000000 )



# OPTION 1

start = datetime.datetime.now()

sorted = []
for i in myDict:
    sorted.append( ( i, myDict[ i ] ) )
sorted.sort( key = lambda x: x[1] )
print( sorted[0][0] )

end = datetime.datetime.now()
print( end - start )



# OPTION 2

start = datetime.datetime.now()

myDict_values = list( myDict.values() )
myDict_keys = list( myDict.keys() )
min_value = min( myDict_values )
print( myDict_keys[ myDict_values.index( min_value ) ] )

end = datetime.datetime.now()
print( end - start )



# OPTION 3

start = datetime.datetime.now()

print( min( myDict, key=myDict.get ) )

end = datetime.datetime.now()
print( end - start )

Beispielausgabe:

#option 1
236230
0:00:14.136808

#option 2
236230
0:00:00.458026

#option 3
236230
0:00:00.824048
1
svinec

um eine bestellbare Klasse zu erstellen, müssen Sie 6 spezielle Funktionen überschreiben, damit sie von der Funktion min () aufgerufen werden

diese Methoden sind __lt__ , __le__, __gt__, __ge__, __eq__ , __ne__, damit sie kleiner als oder gleich, größer als, größer oder gleich, gleich, nicht gleich ..__ sind. Beispielsweise sollten Sie __lt__ wie folgt implementieren:

def __lt__(self, other):
  return self.comparable_value < other.comparable_value

dann können Sie die Min-Funktion wie folgt verwenden:

minValue = min(yourList, key=(lambda k: yourList[k]))

das hat für mich funktioniert.

0
Muhammad Korra