Reverter um Dicionário em Python

Rayven Esplanada 30 janeiro 2023
  1. Utilizar items() para inverter um dicionário em Python
  2. Utilize collections.defaultdict() para Reverter um Dicionário em Python
Reverter um Dicionário em Python

Este artigo demonstra diferentes métodos para inverter um dicionário em Python.

Inverter um dicionário é diferente de inverter uma lista, significa inverter ou trocar a chave e os elementos de valor do dicionário, essencialmente trocando-os para qualquer finalidade para a qual o programador o possa utilizar.

Utilizar items() para inverter um dicionário em Python

Os dicionários Python têm uma função incorporada chamada items() que devolve um objecto iterável que exibirá os pares de valores chave dos dicionários sob a forma de um tuple.

Por exemplo, declarar um dicionário de categorias aleatórias e imprimi-lo utilizando 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')])

A impressão de um dicionário utilizando items() irá produzir uma lista iterável de valores de tuple que podemos manipular utilizando o laço for para dicionários.

Inverter os pares de valores de chave através do laço do resultado de items() e mudar a chave e o valor.

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

O k e o v no laço for significam chave e valor respectivamente. O v: k são os espaços reservados para a chave e o valor em cada iteração, embora definamos o valor anterior v como a nova chave e a chave anterior k como o novo valor.

Resultado:

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

A chave e os elementos de valor são agora invertidos na saída.

As mesmas chaves valorizadas num Dicionário Invertido

Outro exemplo de cenário ao inverter um dicionário é se existem múltiplas chaves ou valores com o mesmo valor. Este é um cenário mais provável para inverter um dicionário.

Por exemplo, um dicionário dos animais preferidos das pessoas.

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

Se o dicionário for invertido utilizando o código acima, a saída não seria como seria de esperar.

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

Resultado:

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

Aqui, faltam 2 elementos do dicionário original porque cada vez que uma chave ou um valor se repete no laço, o registo existente será sobrescrito.

O dicionário contém 3 pessoas com o par de valores Dog mas apenas James foi copiado porque este foi o último registo com o valor de Dog e substituiu os outros 2 elementos do dicionário.

Para resolver este problema, teríamos de armazenar os valores numa lista para que fossem atribuídos a uma única chave.

O código completo do exemplo:

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

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

print(favAnimal)

Utilize collections.defaultdict() para Reverter um Dicionário em Python

O módulo collections tem uma função defaultdict() que pode manipular os valores de um dicionário em Python.

A função defaultdict() é utilizada principalmente para criar valores por defeito de chaves inexistentes. Se aceder a uma chave inexistente, esta pode declarar um valor por defeito para ela, mesmo que não exista.

Esta função é útil para o nosso caso porque queremos instanciar um novo dicionário com valores que são de um tipo de dados de lista.

Utilizando o mesmo exemplo favAnimal, inverter o dicionário e converter os valores para uma lista.

Em primeiro lugar, inicializar o novo dicionário utilizando defaultdict()

from collections import defaultdict

favAnimal_inverted = defaultdict(list)

A seguir, utilizar a compreensão da lista para inversão e armazenar os valores invertidos no novo dicionário.

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

Por último, uma vez que defaultdict() cria uma espécie de subclasse de um dicionário, reconverta-o para o tipo de dicionário de base, envolvendo-o em dict().

result = dict(favAnimal_inverted)
print(result)

Resultado:

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

John, Jenny, e James estão agora na mesma lista com a chave Dog em vez de os outros elementos serem substituídos pelo último elemento que tinha como valor Dog.

O código completo do exemplo:

from collections import defaultdict

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

Em resumo, utilizar items() para passar por cima do dicionário e inverter as chaves e valores. Se por acaso o seu conjunto de dados tiver duplicados, então certifique-se de converter os valores numa lista utilizando defaultdict() e manipule-o de forma a que os valores do dicionário sejam anexados à lista em vez de substituir os 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

Artigo relacionado - Python Dictionary