Tenho uma estrutura complexa de dicionário aninhado e preciso remover elementos com base nos valores de um dicionário aninhado. Meu dicionário se parece com isto:
my_dict = {
'item1': {'name': 'Apple', 'price': 1.0, 'category': {'id': 1, 'name': 'Fruit'}},
'item2': {'name': 'Banana', 'price': 0.5, 'category': {'id': 1, 'name': 'Fruit'}},
'item3': {'name': 'Carrot', 'price': 0.75, 'category': {'id': 2, 'name': 'Vegetable'}},
'item4': {'name': 'Broccoli', 'price': 1.5, 'category': {'id': 2, 'name': 'Vegetable'}}
}
Quero filtrar este dicionário para incluir apenas itens pertencentes à categoria "Fruta". Tentei o seguinte código:
new_dict = {}
for key, value in my_dict.items():
if value['category']['name'] == 'Fruit':
new_dict[key] = value
print(new_dict)
Isso funciona, mas estou me perguntando se há uma maneira mais concisa ou Pythonica de fazer isso, talvez usando compreensão de dicionário ou uma função de filtragem como filter()
.
Como uma compreensão de dicionário
Uma compreensão de dicionário pode ser usada para criar dicionários a partir de expressões arbitrárias de chave e valor .
Usando
filter()
A
filter()
função é usada para:Retorna
dict.items()
um iterável onde cada elemento é uma tupla de comprimento 2. Podemos fornecer cada umitem
a uma função lambda , ondeitem[0]
serão a chave eitem[1]
o valor.filter()
Retorna um iterador das tuplas que correspondem à condição. Podemos encapsular issodict()
para obter um dicionário (da mesma forma quedict([("key1", "value1"), ("key2", "value2")])
retorna{'key1': 'value1', 'key2': 'value2'}
).A maneira mais pitônica
Alcançar o objetivo nebuloso da Pythonicidade (Pythonicity?) é sempre um tanto subjetivo. Acho que a compreensão de um dicionário é limpa e organizada, mas pode ser difícil ver o que está acontecendo, especialmente se a função
dict
estiver profundamente aninhada ou se a condição for complexa. Provavelmente fica mais claro se você a envolver em uma função com nome apropriado para poder ver o que está acontecendo. Adicionei anotações de tipo para maior clareza:Isso é basicamente o mesmo que a primeira abordagem, mas é mais agradável aos olhos.
Você poderia usar uma compreensão de dicionário que seria mais concisa, mas, sem dúvida, mais difícil de ler:
Faça isso de uma maneira "pythônica":
Você também pode fazer isso com
filter