Cómo invertir un diccionario en Python

Rayven Esplanada 30 enero 2023
  1. Usar items() para invertir un diccionario en Python
  2. Usa collections.defaultdict() para revertir un diccionario en Python
Cómo invertir un diccionario en Python

Este artículo muestra diferentes métodos para invertir un diccionario en Python.

Invertir un diccionario es diferente de invertir una lista, significa invertir o cambiar los elementos clave y de valor del diccionario, esencialmente intercambiándolos por cualquier propósito para el que el desarrollador pueda utilizarlo.

Usar items() para invertir un diccionario en Python

Los diccionarios de Python tienen una función incorporada llamada items() que devuelve un objeto iterable que mostrará los pares clave-valor de los diccionarios en forma de tupla.

Por ejemplo, declarar un diccionario de categorías aleatorias e imprimirlo usando items().

dct = {
    "Animal": "Dog",
    "Fruit": "Pear",
    "Vegetable": "Cabbage",
    "Tree": "Maple",
    "Flower": "Daisy",
}

print(dct.items())

Resultado:

dict_items([('Animal', 'Dog'), ('Fruit', 'Pear'), ('Vegetable', 'Cabbage'), ('Tree', 'Maple'), ('Flower', 'Daisy')])

Imprimir un diccionario usando items() producirá una lista iterable de valores de tupla que podemos manipular usando el bucle for para los diccionarios.

Invierta los pares clave-valor haciendo un bucle con el resultado de items() y cambiando la clave y el valor.

dct = {v: k for k, v in dct.items()}
print(dct)

La k y la v en el bucle for significan clave y valor respectivamente. v: k son los marcadores de posición para la clave y el valor en cada iteración, aunque fijamos el valor anterior v como la nueva clave y la clave anterior k como el nuevo valor.

Resultado:

{'Dog': 'Animal', 'Pear': 'Fruit', 'Cabbage': 'Vegetable', 'Maple': 'Tree', 'Daisy': 'Flower'}

Los elementos clave y valor están ahora invertidos en la salida.

Las mismas claves de valor en un diccionario invertido

Otro ejemplo de escenario cuando se invierte un diccionario es si hay múltiples claves o valores con el mismo valor. Este es un escenario más probable para invertir un diccionario.

Por ejemplo, un diccionario de los animales favoritos de la gente.

favAnimal = {
    "John": "Dog",
    "Jane": "Cat",
    "Jerome": "Lion",
    "Jenny": "Dog",
    "Jared": "Giraffe",
    "James": "Dog",
}

Si se invierte el diccionario usando el código anterior, la salida no sería la esperada.

favAnimal = {v: k for k, v in favAnimal.items()}
print(favAnimal)

Resultado:

{'Dog': 'James', 'Cat': 'Jane', 'Lion': 'Jerome', 'Giraffe': 'Jared'}

Aquí faltan 2 elementos del diccionario original porque cada vez que una tecla o un valor se repite en el bucle, el registro existente será sobrescrito.

El diccionario contiene 3 personas con el par de valores Dog pero sólo se copió James porque éste era el último registro con el valor de Dog y ha sobrescrito los otros 2 elementos del diccionario.

Para resolver este problema, tendríamos que almacenar los valores en una lista para que se asignaran a una sola clave.

El código de ejemplo completo:

favAnimal = {
    "John": "Dog",
    "Jane": "Cat",
    "Jerome": "Lion",
    "Jenny": "Dog",
    "Jared": "Giraffe",
    "James": "Dog",
}

favAnimal = {v: k for k, v in favAnimal.items()}

print(favAnimal)

Usa collections.defaultdict() para revertir un diccionario en Python

El módulo collections tiene una función defaultdict() que puede manipular los valores de un diccionario en Python.

defaultdict() se utiliza principalmente para crear valores por defecto de claves inexistentes. Si accedes a una clave inexistente, puede declarar un valor por defecto para ella, incluso si no existe.

Esta función es útil para nuestro caso porque queremos instanciar un nuevo diccionario con valores que son de un tipo de datos de lista.

Usando el mismo ejemplo favAnimal, invierte el diccionario y convierte los valores a una lista.

Primero, inicializa el nuevo diccionario usando defaultdict().

from collections import defaultdict

favAnimal_inverted = defaultdict(list)

A continuación, utilice la comprensión de la lista para la inversión y guarde los valores invertidos en el nuevo diccionario.

{favAnimal_inverted[v].append(k) for k, v in favAnimal.items()}

Por último, ya que defaultdict() crea una especie de subclase de un diccionario, reconviértalo al tipo de diccionario base envolviéndolo en dict().

result = dict(favAnimal_inverted)
print(result)

Resultado:

{'Dog': ['John', 'Jenny', 'James'], 'Cat': ['Jane'], 'Lion': ['Jerome'], 'Giraffe': ['Jared']}

John, Jenny y James ahora están en la misma lista con la clave Dog en lugar de que los otros elementos sean sobrescritos por el último elemento que tenía Dog como valor.

El código de ejemplo completo:

from collections import defaultdict

favAnimal_inverted = defaultdict(list)
result = dict(favAnimal_inverted)
print(result)

En resumen, usa items() demasiado bucle sobre el diccionario e invierte las claves y valores. Si por casualidad tu conjunto de datos tiene duplicados, entonces asegúrate de convertir los valores en una lista usando defaultdict() y manipúlalo de manera que los valores del diccionario se añadan a la lista en lugar de reemplazar los valores existentes.

Rayven Esplanada avatar Rayven Esplanada avatar

Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.

LinkedIn

Artículo relacionado - Python Dictionary