Tengo un dictionary
: las claves son cadenas, los valores son enteros.
Ejemplo:
stats = {'a':1000, 'b':3000, 'c': 100}
Me gustaría obtener 'b'
una respuesta, ya que es la clave con un valor más alto.
Hice lo siguiente, usando una lista intermedia con tuplas de clave-valor invertidas:
inverse = [(value, key) for key, value in stats.items()]
print max(inverse)[1]
¿Es ese el mejor enfoque (o incluso más elegante)?
python
dictionary
max
ricafeal
fuente
fuente
max(stats)
?max(stats)
usará las etiquetas como claves (devolverá'c'
, dado que esa es la etiqueta máxima),max(stats, key=lambda key: stats[key])
es lo que OP buscó después (lo que devolverá'b'
, etiqueta de valor indexado máximo). ¿Está más claro?Respuestas:
Puedes usar
operator.itemgetter
para eso:Y en lugar de construir una nueva lista en el uso de la memoria
stats.iteritems()
. Elkey
parámetro de lamax()
función es una función que calcula una clave que se utiliza para determinar cómo clasificar los elementos.Tenga en cuenta que si tuviera otro par clave-valor 'd': 3000, este método solo devolverá uno de los dos , aunque ambos tengan el valor máximo.
Si usa Python3:
fuente
max(stats.iterkeys(), key=(lambda key: stats[key]))
key=lambda x: x[1]
?max(stats, key=lambda key: stats[key])
fuente
stats[max(stats, key=stats.get)]
max_value = max(stats.values()); {key for key, value in stats.items() if value == max_value}
He probado MUCHAS variantes, y esta es la forma más rápida de devolver la clave de dict con el valor máximo:
Para darle una idea, aquí hay algunos métodos candidatos:
El diccionario de prueba:
Y los resultados de la prueba en Python 3.2:
Y bajo Python 2.7:
Puede ver que
f1
es el más rápido en Python 3.2 y 2.7 (o, más completamente,keywithmaxval
en la parte superior de esta publicación)fuente
f7
es comof1
, simplemente no dar un nombre a un objeto intermedio.f7
debería ser (muy ligeramente) más rápido quef1
, no mucho más lento. Y eso es lo que obtengo:>>> 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
Si necesita conocer solo una clave con el valor máximo, puede hacerlo sin
iterkeys
oiteritems
porque la iteración a través del diccionario en Python es la iteración a través de sus claves.EDITAR:
De los comentarios, @ user1274878:
Sí...
max
El
key
argumento opcional describe cómo comparar elementos para obtener el máximo entre ellos:Los valores devueltos serán comparados.
Dict
Python dict es una tabla hash. Una clave de dict es un hash de un objeto declarado como clave. Debido a razones de rendimiento, iteración a través de un dict implementado como iteración a través de sus claves.
Por lo tanto, podemos usarlo para eliminar la operación de obtener una lista de claves.
Cierre
La
stats
variable disponible a través del__closure__
atributo de lalambda
función como puntero al valor de la variable definida en el ámbito primario.fuente
Ejemplo:
Si desea encontrar el valor máximo con su clave, tal vez seguir podría ser simple, sin ninguna función relevante.
La salida es la clave que tiene el valor máximo.
fuente
Aquí hay otro:
La función
key
simplemente devuelve el valor que debe usarse para la clasificación ymax()
devuelve el elemento solicitado de inmediato.fuente
max(stats, key=lambda k: stats[k])
Si no te importa el valor (me sorprendería, pero) puedes hacer:
Me gusta desempacar la tupla mejor que un subíndice [0] al final de la expresión. Nunca me gusta mucho la legibilidad de las expresiones lambda, pero encuentro esta mejor que la operator.itemgetter (1) en mi humilde opinión.
fuente
_
podría usarse en lugar deignored
.ignored
ve bastante feo, pero algunas personas están en contra de usarlo_
por varias razones. Creo que el primer fragmento está bien incluso si ignoras el valorDado que más de una entrada puede tener el valor máximo. Haría una lista de las claves que tienen el valor máximo como su valor.
Esto le dará 'b' y cualquier otra clave máxima también.
Nota: para uso de Python 3 en
stats.items()
lugar destats.iteritems()
fuente
max
fuera costosa (p. Ej., Un diccionario LARGO), le recomendaría[key for m in [max(stats.values())] for key,val in stats.iteritems() if val == m]
si desea una línea, de lo contrario, calcule dem = ...
antemano.Puedes usar:
Para devolver la clave, use el par de valores:
fuente
Para obtener la clave / valor máximo del diccionario
stats
:>>> max(stats.items(), key = lambda x: x[0]) ('c', 100)
>>> max(stats.items(), key = lambda x: x[1]) ('b', 3000)
Por supuesto, si desea obtener solo la clave o el valor del resultado, puede usar la indexación de tuplas. Por ejemplo, para obtener la clave correspondiente al valor máximo:
>>> max(stats.items(), key = lambda x: x[1])[0] 'b'
Explicación
El método del diccionario
items()
en Python 3 devuelve un objeto de vista del diccionario. Cuando este objeto de vista se repite, lamax
función genera los elementos del diccionario como tuplas del formulario(key, value)
.>>> list(stats.items()) [('c', 100), ('b', 3000), ('a', 1000)]
Cuando usa la
lambda
expresiónlambda x: x[1]
, en cada iteración,x
es una de estas tuplas(key, value)
. Entonces, al elegir el índice correcto, selecciona si desea comparar por claves o por valores.Python 2
Para las versiones de Python 2.2+, el mismo código funcionará. Sin embargo, es mejor usar el
iteritems()
método de diccionario en lugar deitems()
para el rendimiento.Notas
Esta respuesta se basa en los comentarios sobre la respuesta de Climbs_lika_Spyder .
El código utilizado se probó en Python 3.5.2 y Python 2.7.10.
fuente
fuente
Por las soluciones iteradas a través de comentarios en la respuesta seleccionada ...
En Python 3:
En Python 2:
fuente
Llegué aquí buscando cómo regresar en
mydict.keys()
función del valor demydict.values()
. En lugar de solo la clave devuelta, estaba buscando devolver el número x superior de valores.Esta solución es más simple que usar la
max()
función y puede cambiar fácilmente la cantidad de valores devueltos:Si desea la clave de clasificación más alta, solo use el índice:
Si desea las dos mejores claves de clasificación más alta, solo use el corte de lista:
fuente
max()
. Está claro que es el más rápido. Pensé que ofrecería una solución diferente con el beneficio de cortar, que fue más útil para mí en ese momentoNo estaba satisfecho con ninguna de estas respuestas.
max
siempre elige la primera clave con el valor máximo. El diccionario podría tener varias claves con ese valor.Publicar esta respuesta en caso de que ayude a alguien. Vea la siguiente publicación SO
¿Qué máximo elige Python en caso de empate?
fuente
Con
collections.Counter
usted podria hacerSi es apropiado, simplemente puede comenzar con un vacío
collections.Counter
y agregarlefuente
Una cola de almacenamiento dinámico es una solución generalizada que le permite extraer las n teclas principales ordenadas por valor:
Nota
dict.__getitem__
es el método llamado por el azúcar sintácticodict[]
. A diferencia dedict.get
, regresaráKeyError
si no se encuentra una clave, que aquí no puede ocurrir.fuente
max((value, key) for key, value in stats.items())[1]
fuente
+1 a la solución más simple de @Aric Coady .
Y también una forma de seleccionar al azar una de las teclas con valor máximo en el diccionario:
fuente
fuente
Qué tal si:
fuente
zip(stats.keys(), stats.values())
es solo una forma más larga de escribirstats.items()
. Una vez que realice ese cambio, su respuesta será casi idéntica a varias respuestas anteriores.items
No es lo mismo quezip
. Simplemente produce el mismo resultado.Probé la respuesta aceptada Y la solución más rápida de @thewolf contra un bucle muy básico y el bucle fue más rápido que ambos:
resultados:
fuente
Para los usuarios científicos de Python, aquí hay una solución simple usando Pandas:
fuente
En el caso de que tenga más de una clave con el mismo valor, por ejemplo:
Puede obtener una colección con todas las claves con el valor máximo de la siguiente manera:
fuente
Enfoque mucho más simple de entender:
Salida: ['a', 'g']
Ahora puede elegir solo una clave:
fuente