python - Obtenga la clave correspondiente al valor mínimo dentro de un diccionario
max dictionary python (15)
Si tengo un diccionario de Python, ¿cómo obtengo la clave de la entrada que contiene el valor mínimo?
Estaba pensando en algo que hacer con la función min()
...
Dada la entrada:
{320:1, 321:0, 322:3}
Volvería 321
.
¿Es esto lo que estás buscando?
d = dict()
d[15.0]=''fifteen''
d[14.0]=''fourteen''
d[14.5]=''fourteenandhalf''
print d[min(d.keys())]
Estampa ''catorce''
Aquí hay una respuesta que realmente da a la solución la OP solicitada:
>>> 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)
Sin d.iteritems()
uso de d.iteritems()
será más eficiente para diccionarios más grandes.
Comparé cómo funcionan las siguientes tres opciones:
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 )
Salida de muestra:
#option 1
236230
0:00:14.136808
#option 2
236230
0:00:00.458026
#option 3
236230
0:00:00.824048
Lo mejor: min(d, key=d.get)
- ¡no hay razón para interponer una capa de min(d, key=d.get)
lambda
inútil o extraer elementos o claves!
Otro enfoque para abordar el problema de varias claves con el mismo valor mínimo:
>>> 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]
Para el caso en el que tiene varias claves mínimas y desea que sea sencillo
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'']
Por varias claves que tienen igual valor más bajo, se puede utilizar una lista por comprensión:
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]
Una versión funcional equivalente:
res = list(filter(lambda x: d[x]==minval, d))
Si no está seguro de no tener varios valores mínimos, sugeriría:
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
"""
Use min
con un iterador (para python 3 use items
lugar de iteritems
); en lugar de lambda, use el itemgetter
del operador, que es más rápido que lambda.
from operator import itemgetter
min_key, _ = min(d.iteritems(), key=itemgetter(1))
para crear una clase ordenable, tiene que anular 6 funciones especiales, de modo que la función min () las llame
estos métodos son __lt__ , __le__, __gt__, __ge__, __eq__ , __ne__
en el orden en que son menores que, menores o iguales, mayores que, mayores que o iguales, iguales, no iguales. por ejemplo, debe implementar __lt__
siguiente manera:
def __lt__(self, other):
return self.comparable_value < other.comparable_value
entonces puedes usar la función min como sigue:
minValue = min(yourList, key=(lambda k: yourList[k]))
esto funcionó para mí.
min(d.items(), key=lambda x: x[1])[0]
Edición: esta es una respuesta a la pregunta original del OP sobre la clave mínima, no la respuesta mínima.
Puede obtener las teclas del dict utilizando la función de keys
, y tiene razón al usar min
para encontrar el mínimo de esa lista.
# python
d={320:1, 321:0, 322:3}
reduce(lambda x,y: x if d[x]<=d[y] else y, d.iterkeys())
321
>>> d = {320:1, 321:0, 322:3}
>>> min(d, key=lambda k: d[k])
321
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]