d3 = dict(d1, **d2)
Eu entendo que isso mescla o dicionário. Mas, é único? E se d1 tiver a mesma chave que d2, mas um valor diferente? Gostaria que d1 e d2 fossem mesclados, mas d1 tem prioridade se houver chave duplicada.
python
dictionary
TIMEX
fonte
fonte
**
passagem de argumento de palavra-chave, a menos que todas as chaves ded2
sejam strings. Se nem todas as chavesd2
são strings, isso falha no Python 3.2 e em implementações alternativas de Python como Jython, IronPython e PyPy. Consulte, por exemplo, mail.python.org/pipermail/python-dev/2010-April/099459.html .Respostas:
Você pode usar o
.update()
método se não precisar mais do originald2
:Por exemplo:
Atualizar:
Claro que você pode copiar o dicionário primeiro para criar um novo mesclado. Isso pode ou não ser necessário. Caso você tenha objetos compostos (objetos que contêm outros objetos, como listas ou instâncias de classe) em seu dicionário,
copy.deepcopy
também deve ser considerado.fonte
isinstance(int, object) is True
aindadeepcopy
não parece necessário.Em Python2,
d1 substitui d2:
d2 substitui d1:
Esse comportamento não é apenas um acaso de implementação; é garantido na documentação :
fonte
**
notação, todas as chaves desse dict devem ser strings. Consulte o thread python-dev começando em mail.python.org/pipermail/python-dev/2010-April/099427.html para mais.d = dict(**d1, **d2)
funciona, mas é o que @IoannisFilippidis faz referência em seu comentário. Talvez incluir o snippet aqui fosse mais claro, então aqui está.Se você quiser
d1
ter prioridade nos conflitos, faça:Caso contrário, inverta
d2
ed1
.fonte
Minha solução é definir uma função de mesclagem . Não é sofisticado e custa apenas uma linha. Aqui está o código em Python 3.
Testes
Ele funciona para um número arbitrário de argumentos do dicionário. Se houver alguma chave duplicada nesse dicionário, a chave do dicionário mais à direita na lista de argumentos vence.
fonte
.update
chamada nele (merged={}
seguido porfor d in dict: merged.update(d)
) seria mais curto, mais legível e mais eficiente.reduce
elambda
é, como sobrereturn reduce(lambda x, y: x.update(y) or x, dicts, {})
?Trey Hunner tem uma boa postagem no blog que descreve várias opções para mesclar vários dicionários, incluindo (para python3.3 +) ChainMap e descompactação de dicionário .
fonte
Começando em
Python 3.9
, o operador|
cria um novo dicionário com as chaves e valores mesclados de dois dicionários:Este:
Observe também o
|=
operador que modifica d2 mesclando d1 em, com prioridade nos valores d1:fonte
Acredito que, conforme dito acima, usar
d2.update(d1)
é a melhor abordagem e que você também pode copiard2
primeiro se ainda precisar.Embora eu queira ressaltar que,
dict(d1, **d2)
na verdade, é uma maneira ruim de mesclar dicionários em geral, já que os argumentos de palavra-chave precisam ser strings, portanto, falhará se você tiver umdict
, como:fonte