Qual é a melhor maneira de estender um dicionário com outro? Por exemplo:
>>> a = { "a" : 1, "b" : 2 }
>>> b = { "c" : 3, "d" : 4 }
>>> a
{'a': 1, 'b': 2}
>>> b
{'c': 3, 'd': 4}
Estou procurando por qualquer operação para obter esse for
loop de prevenção :
{ "a" : 1, "b" : 2, "c" : 3, "d" : 4 }
Desejo fazer algo como:
a.extend(b) # This does not work
python
dictionary
FerranB
fonte
fonte
Respostas:
Documentação mais recente da biblioteca padrão do Python
fonte
{"a":2, "b":3}
com dict{"b":4, "c":5}
para dict{"a":2, "b":3,"c":5}
? É claro que é possível usandoupdate()
movendo algumas coisas ao redor, mas seria melhor se ele poderia ser realizado em apenas uma linha ...update
substitui silenciosamente as entradas existentes. Ou seja, quaisquer valores emb
sobrescrevem aqueles ema
chaves sobrepostas.Uma bela jóia nesta questão encerrada :
O "caminho oneliner", alterando nenhum dos ditados de entrada, é
Aprenda o que
**basket_two
(o**
) significa aqui .Em caso de conflito, os itens de
basket_two
substituirão os debasket_one
. No caso das falas simples, isso é bastante legível e transparente, e não tenho nenhum remorso em usá-lo sempre que um ditado que é uma mistura de outros dois for útil (qualquer leitor que tenha problemas para entender isso será realmente muito bem atendido). a maneira como isso o leva a aprenderdict
e o**
formulário ;-). Então, por exemplo, usa como:são ocorrências razoavelmente frequentes no meu código.
Originalmente enviado por Alex Martelli
Nota: No Python 3, isso funcionará apenas se todas as chaves do basket_two forem a
string
.fonte
dict
é fácil de encontrar, enquanto**
é um pouco mais complicada (a palavra-chave é kwargs ). Aqui está uma boa explicação: saltycrane.com/blog/2008/01/...basket_one.update(<dict>)
como o nome disse, atualiza um dicionário existente (ou clonado).**anotherdict
, devem ser cadeias de caracteres.Você já tentou usar a compreensão de dicionário com o mapeamento de dicionário:
Outra maneira de fazer é usar dict (iterável, ** kwarg)
No Python 3.9, você pode adicionar dois dict usando union | operador
fonte
Adicionará chaves e valores de b a a , substituindo se já houver um valor para uma chave.
fonte
Como outros já mencionaram,
a.update(b)
para alguns ditadosa
eb
alcançarão o resultado solicitado em sua pergunta. No entanto, quero ressaltar que muitas vezes vi oextend
método de mapear / definir objetos que, na sintaxea.extend(b)
,a
os valores de NÃO devem ser substituídos pelosb
valores de.a.update(b)
sobrescrevea
os valores e, portanto, não é uma boa opção paraextend
.Observe que alguns idiomas chamam esse método
defaults
ouinject
, como pode ser considerado como uma maneira de injetar os valores de b (que podem ser um conjunto de valores padrão) em um dicionário sem substituir os valores que já possam existir.Obviamente, você pode observar que
a.extend(b)
é quase o mesmo queb.update(a); a=b
. Para remover a atribuição, você pode fazer o seguinte:Agradecemos a Tom Leys pela ideia inteligente de usar um
dict
construtor sem efeitos colateraisextend
.fonte
Você também pode usar as coleções do python.Chainmap, que foi introduzido no python 3.3.
Isso tem algumas vantagens possíveis, dependendo do seu caso de uso. Eles são explicados em mais detalhes aqui , mas darei uma breve visão geral:
Isso principalmente o torna útil para coisas como dicionários de configuração.
fonte
Caso seja necessário como uma classe , você pode estendê-lo com dict e usar o método update :
fonte