Inicializando dicionário com valores padrões (Python)

Você tem uma lista com as chaves e quer criar um dicionário que já venha populado com um valor padrão? Existem diversas formas de resolver esta questão, mas vou mostrar como fazer isso utilizando uma funcionalidade nativa do próprio dicionário.

Para contexto, vamos imaginar que você possui as seguintes chaves: “foo”, “bar” e “bacon”. Seu objeto é criar um dicionário que já possua o valor -1 para cada uma destas chaves. O modo mais ‘manual’ de se fazer isso seria assim:

dicionario = {
    "foo": -1,
    "bar": -1,
    "bacon": -1
}

Ok, isso resolve o problema… mas você precisaria editar este código sempre que ocorrer alguma mudança nas chaves.

 

A evolução do código acima seria utilizar um for para fazer esta atribuição:

chaves = ["foo", "bar", "bacon"]
dicionario = {}

for chave in chaves:
    dicionario[chave] = -1

Melhorou um pouco, mas pode ficar melhor. O próprio dicionário possui uma função que faz esta iteração para você. Veja como fica o código, quando utilizamos esta função:

 

chaves = ["foo", "bar", "bacon"]
dicionario = { **dict.fromkeys(chaves, -1) }

Agora ficou bem melhor e menor (menos linhas digitadas). Uma das vantagens deste método é que você pode utiliza-lo diversas vezes no mesmo dicionário, quando quiser que determinadas chaves possuam valores padrões diferentes. Exemplo:

chaves = ["foo", "bar", "bacon"]
chaves_alt = ["abc", "def", "ghi"]

dicionario = { 
    **dict.fromkeys(chaves, -1),
    **dict.fromkeys(chaves_alt, 0),
 }

O dicionário criado acima possuirá o valor -1 para as chaves foo, bar e bacon e o valor 0  para as chaves abc, def, ghi.

 

Uma última coisa que podemos fazer para deixar este exemplo ainda mais prático seria encapsular isso em uma função:

def initialize_dict_values(keys, default_value, dictionary=dict()):
    """Adds keys to the dictionary with a default value.
    If no dictionary is provided, will create a new one.

    :param keys: List of strings containing the dictionary keys
    :param default_value: default value to be associated with the keys
    :param dictionary: dictionary that will receive the keys
    :return: updated dictionary
    """

    return {**dictionary, **{ **dict.fromkeys(keys, default_value)}}

Na função acima, estou mesclando dois dicionários, o que foi fornecido e o que foi gerado com as chaves que o usuário passou. Se nenhum dicionário for fornecido, o retorno será um novo dicionário com os valores inicializados. Só um alerta: acredito que esta função não vai funcionar no Python versão 3.4 ou inferior.

O código desta função está no meu github.

 

Espero ter ajudado.

The following two tabs change content below.
Arquiteto de Software e Desenvolvedor Backend (quase Fullstack), geralmente trabalho com C#, PowerShell, Python, Golang, bash e Unity (esse é mais por hobby). Estou sempre buscando algo novo para aprender, adicionando novas ferramentas ao meu cinto de utilidades.
Posted in Dev, Python and tagged , , .