Muitas linguagens fornecem uma biblioteca padrão que fornece um tipo de dicionário ou mapa de árvore binária. Muitas dessas implementações de estruturas de dados fornecem uma função para dividir a estrutura de dados em um par de estruturas de dados com base em alguma condição.
Isso é conhecido como operação de partição. Rust chama isso de "separação". Os tipos C++ map
têm operação de "limite inferior" e "limite superior" para comparação com chaves. A biblioteca padrão também fornece uma operação de "partição" que existe no std::algorithm
.
Não consigo ver uma maneira ideomática de fazer isso em Python. Consegui criar uma maneira manual de fazer isso, mas não gosto muito desse código, porque ele não divide um dict
em duas partes, mas divide uma parte e depois divide outra parte, resultando em código frágil (e duplicado).
map = {
...
}
map_part_1 = {
key: value for key, value in map.items() if <condition>
}
map_part_2 = {
key: value for key, value in map.items() if not <condition>
}
Não é ótimo, certo? Existe uma maneira melhor?
Apenas um auxiliar mais curto (do que o da sua resposta) que avalia a condição apenas uma vez para cada item:
Se você quiser manter a ordem do primeiro dict sendo o dicionário de condições avaliadas verdadeiras, e o segundo dicionário sendo o dicionário de condições avaliadas falsas, substitua
return dicts
porreturn dicts[::-1]
.Experimente isso online!
Não estou convencido de que esta seja a melhor abordagem. Funciona, mas requer a escrita de uma função auxiliar.
Que seria então usado com a
lambda
, assim:Este caso de teste demonstra que funciona.
Mas talvez exista alguma solução melhor que não exija que escrevamos nossa própria função auxiliar para fazer isso?
Talvez esteja faltando alguma coisa, mas você pode fazer isso em um loop:
Impressões:
Se quiser modificar o dicionário de entrada, você pode usar
dict.pop
: