python dictionary min minimum idioms

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]