¿Error tipográfico en tu declaración? De lo contrario, ¿por qué 321? ¿No debería ser 320?
GreenMatt
3
@myself: Bien, ahora veo: lo que se desea es la clave de la entrada donde el valor de la entrada es el mínimo. Mejor redacción de la pregunta, por favor, ya que otros obviamente pensaron lo mismo que yo.
GreenMatt
2
Día de reconocimiento de la estructura de datos: si solo consulta (o elimina) el elemento mínimo, considere usar una cola o montón prioritario.
Coronel Panic
Respuestas:
597
Lo mejor: ¡ min(d, key=d.get)no hay razón para interponer una lambdacapa de indirección inútil o extraer elementos o claves!
@ KarelBílek significa que pasó como "d" una lista [11, 22, 33], por ejemplo , en lugar de un diccionario, por ejemplo {1: 11, 2:22, 3:33}. 'd.get' es válido para un diccionario, pero no para una lista.
ToolmakerSteve
99
¿Qué pasa si dos claves diferentes tienen el mismo valor? y ambos resultan ser el valor más pequeño? ¿Cómo puedes hacer que regrese ambos?
user3226932
55
¿Se puede usar esta técnica si los valores dict son listas, por ejemplo d={"a":[10, None], "b":[20, None]}, donde el mínimo se calcula a partir de d [clave] [0]?
TrakJohnson
44
¿Como funciona esto? Qué tipo de función min es esa, pensé que min () solo tomaba valores individuales o listas como argumentos. ¿Cómo se repite en todas las entradas del diccionario?
azureai
2
min()devolver el valor en el primer valor en ordenado. clave designar la forma de ordenar los valores. key=d.getsignifica que la lista se ordenará por valores del diccionario.
notilas 06/0618
45
Aquí hay una respuesta que realmente da la solución que solicitó el OP:
>>> 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)
d.iteritems()Sin embargo, el uso será más eficiente para diccionarios más grandes.
Su respuesta es muy útil y otros probablemente estén de acuerdo: vea los múltiples comentarios para ese asunto en la respuesta aceptada. Sin embargo, necesitaba volver dos veces para encontrarlo: ¿consideraría proponer una edición a la respuesta aceptada? La tuya es en realidad complementaria.
Usar mincon un iterador (para uso de Python 3 en itemslugar de iteritems); en lugar de lambda, use el itemgetteroperador from, 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, debe anular 6 funciones especiales, para que la función min () la llame
estos métodos están __lt__ , __le__, __gt__, __ge__, __eq__ , __ne__en orden para que sean menores que, menores que o iguales, mayores que, mayores que o iguales, iguales, no iguales. por ejemplo, debe implementar __lt__lo siguiente:
Use la función zip para crear un iterador de tuplas que contengan valores y claves. Luego envuélvala con una función min que tome el mínimo basado en la primera tecla. Esto devuelve una tupla que contiene un par (valor, clave). El índice de [1] se usa para obtener la clave correspondiente
Si bien este código puede responder a la pregunta, proporcionar un contexto adicional con respecto a por qué y / o cómo este código responde a la pregunta mejora su valor a largo plazo.
β.εηοιτ.βε
@ β.εηοιτ.βε que mejor?
Raj
-1
# python
d={320:1,321:0,322:3}
reduce(lambda x,y: x if d[x]<=d[y]else y, d.iterkeys())321
1) Reducir es generalmente más lento que las herramientas de iterto. 2) La mayoría de las implementaciones de reduce pueden hacerse más simples con cualquiera o con todas. 3) Soy un portavoz gigante para GvR. 4) El módulo del operador hace innecesarios los lambdas más simples, y los lambdas complejos deben definirse como funciones reales de todos modos. Tal vez solo tengo miedo de la programación funcional. ;)
MikeD
@miked: cuéntame más. ¿Qué es gvr y cuál es el módulo del operador? podrías publicar enlaces? Puedo conocer a otros, pero sigo siendo un intermediario en Python. ¡dispuesto a aprender! :-)
eruciforme
GvR es Guido van Rossum, el dictador benevolente de por vida de Python. Aquí hay una publicación de cinco años de él que explica por qué los lisp-isms (mapa, filtro, reducción, lambda) no tienen mucho lugar en Python en el futuro, y esas razones aún son ciertas hoy en día. El módulo del operador tiene reemplazos para extraer miembros : "lambda x: x [1]" en comparación con "itemgetter (1)" es un carácter más largo y posiblemente demore más en entenderse. Estoy sin espacio, ¡pero hago preguntas!
Respuestas:
Lo mejor: ¡
min(d, key=d.get)
no hay razón para interponer unalambda
capa de indirección inútil o extraer elementos o claves!fuente
[11, 22, 33]
, por ejemplo , en lugar de un diccionario, por ejemplo{1: 11, 2:22, 3:33}
. 'd.get' es válido para un diccionario, pero no para una lista.d={"a":[10, None], "b":[20, None]}
, donde el mínimo se calcula a partir de d [clave] [0]?min()
devolver el valor en el primer valor en ordenado. clave designar la forma de ordenar los valores.key=d.get
significa que la lista se ordenará por valores del diccionario.Aquí hay una respuesta que realmente da la solución que solicitó el OP:
d.iteritems()
Sin embargo, el uso será más eficiente para diccionarios más grandes.fuente
operator.itemgetter(1)
.Para varias claves que tienen el mismo valor más bajo, puede usar una lista de comprensión:
Una versión funcional equivalente:
fuente
min(d.items(), key=lambda x: x[1])[0]
fuente
fuente
key=d.get
es mejor.Para el caso en el que tiene varias claves mínimas y desea que sea simple
fuente
Si no está seguro de que no tiene múltiples valores mínimos, sugeriría:
fuente
Editar: esta es una respuesta a la pregunta original del OP sobre la clave mínima, no la respuesta mínima.
Puede obtener las claves del dict usando la
keys
función, y tiene razón al usarmin
para encontrar el mínimo de esa lista.fuente
Otro enfoque para abordar el problema de las claves múltiples con el mismo valor mínimo:
fuente
Usar
min
con un iterador (para uso de Python 3 enitems
lugar deiteritems
); en lugar de lambda, use elitemgetter
operador from, que es más rápido que lambda.fuente
fuente
Comparé cómo funcionan las siguientes tres opciones:
Salida de muestra:
fuente
Para crear una clase ordenable, debe anular 6 funciones especiales, para que la función min () la llame
estos métodos están
__lt__ , __le__, __gt__, __ge__, __eq__ , __ne__
en orden para que sean menores que, menores que o iguales, mayores que, mayores que o iguales, iguales, no iguales. por ejemplo, debe implementar__lt__
lo siguiente:entonces puede usar la función min de la siguiente manera:
Esto funcionó para mí.
fuente
Use la función zip para crear un iterador de tuplas que contengan valores y claves. Luego envuélvala con una función min que tome el mínimo basado en la primera tecla. Esto devuelve una tupla que contiene un par (valor, clave). El índice de [1] se usa para obtener la clave correspondiente
fuente
fuente
min()
).¿Es esto lo que estás buscando?
Imprime 'catorce'
fuente