HOWTO · Python

Encontrar la clave por valor en el Diccionario Python

Este tutorial demuestra cómo obtener clave por valor en el diccionario de Python.

En esta página

Los diccionarios de Python relacionan claves con valores, así que para encontrar una clave a partir de un valor hay que buscar entre las entradas del diccionario. Recorre cada par clave–valor y compara su valor con el objetivo. Usa un bucle o next() si necesitas la primera clave coincidente, y una comprensión de listas si necesitas todas. Estas búsquedas recorren las entradas hasta encontrar una coincidencia o agotar el diccionario.

Busca pares clave–valor con un bucle

dict.items() proporciona un iterable de pares clave–valor. Un bucle que lo recorra puede devolver la primera clave cuyo valor sea igual al objetivo. Devolver None al terminar el bucle ofrece un resultado claro cuando no hay coincidencias; si None también pudiera ser una clave válida, usa un centinela distinto o devuelve un par (found, key).

Ejecuta este ejemplo:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

def find_key_by_value(dictionary, target):
    for key, value in dictionary.items():
        if value == target:
            return key
    return None

scores = {"Ada": 91, "Lin": 87, "Sam": 91}
print(find_key_by_value(scores, 87))
Lin

El bucle devuelve la clave en cuanto encuentra una coincidencia, por lo que obtiene la primera según el orden de iteración del diccionario. Si varias claves tienen el valor objetivo, las posteriores no se visitan después de encontrar la primera.

Obtén la primera clave coincidente con next()

Una expresión generadora permite escribir de forma compacta la misma búsqueda de la primera coincidencia. Pásala a next() junto con un valor predeterminado para que la llamada devuelva None cuando no haya ninguna clave coincidente, en lugar de generar StopIteration.

El ejemplo define el objetivo como un argumento, de modo que puede buscar tanto un valor coincidente como uno que no coincida:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

def find_key_with_next(dictionary, target):
    return next((key for key, value in dictionary.items() if value == target), None)

scores = {"Ada": 91, "Lin": 87, "Sam": 91}
print(find_key_with_next(scores, 87))
print(find_key_with_next(scores, 100))

La expresión generadora produce las claves a medida que se necesitan, así que no crea una lista con todas las coincidencias. Si no coincide ningún valor, se devuelve el valor predeterminado. Si tus datos pueden contener None como clave, elige un valor predeterminado que no pueda confundirse con una clave válida.

Recopila todas las claves coincidentes con una comprensión

Si importan los valores duplicados, recopila todas las claves coincidentes con una comprensión de listas:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

def find_all_keys(dictionary, target):
    return [key for key, value in dictionary.items() if value == target]

scores = {"Ada": 91, "Lin": 87, "Sam": 91}
print(find_all_keys(scores, 91))
['Ada', 'Sam']

La lista devuelta está vacía si ningún valor coincide; de lo contrario, contiene todas las claves coincidentes. Una expresión filter() también puede seleccionar los pares clave–valor que coinciden, pero la comprensión muestra en un mismo lugar la condición y las claves recopiladas.

Encuentra una clave mediante listas alineadas de claves y valores

Otra opción es convertir dict.keys() y dict.values() en listas. Sus posiciones se corresponden: la clave de la posición i pertenece al valor de la posición i. Al llamar a index() sobre la lista de valores se obtiene la primera posición que contiene el objetivo; usa esa posición para seleccionar la clave correspondiente de la lista de claves.

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

scores = {"Ada": 91, "Lin": 87, "Sam": 91}
keys = list(scores.keys())
values = list(scores.values())
position = values.index(91)
print(keys[position])
Ada

index() genera ValueError si el valor no está presente, así que comprueba primero si pertenece a values o gestiona ese error cuando sea posible que falte. Si hay valores duplicados, index() selecciona únicamente la primera posición coincidente.

Gestiona duplicados, valores ausentes y rendimiento

Elige el tipo de resultado según la tarea: un bucle o next() devuelve una clave, mientras que la comprensión devuelve una lista con todas las claves coincidentes. Los métodos que buscan la primera coincidencia y index() se detienen al encontrarla; el resultado depende del orden de iteración del diccionario. Si no hay coincidencias, el resultado puede ser None o una lista vacía; la técnica de las listas alineadas genera ValueError, a menos que compruebes si el valor está presente o gestiones el error.

Todos estos métodos pueden tener que inspeccionar cada entrada, así que, en el peor de los casos, el tiempo de búsqueda es proporcional al número de entradas del diccionario. El bucle y la expresión generadora no crean una colección de coincidencias. La comprensión crea una lista de resultados, y el método de las listas alineadas crea listas separadas de claves y valores antes de buscar. Si necesitas buscar repetidamente una clave a partir de un valor, considera mantener una correspondencia inversa; ten en cuenta los valores duplicados, porque un diccionario inverso sencillo conserva una sola clave por valor. Si trabajas con diccionarios anidados, decide primero en qué nivel quieres buscar y después aplica a ese diccionario el mismo patrón de iteración por entradas.