Portuguese (Português) translation by Erick Patrick (you can also view the original English article)
Em um artigo anterior, aprendemos sobre os Dicionários em Python e vimos como são considerados conjuntos desordenados de pares chave/valor
, onde usamos as chaves para acessar itens, ao contrário de posições, em listas, por exemplo.
Nessa dica rápida, mostremos como você pode concatenar (fundir) dois dicionários.
O Método Update()
Digamos que temos os dois dicionários abaixo:
dict1 = {'bookA': 1, 'bookB': 2, 'bookC': 3} dict2 = {'bookC': 2, 'bookD': 4, 'bookE': 5}
Como podemos fundir os dois dicionários em um só? Podemos usar a função update([other])
para esse fim. Como dito na documentação do Python:
Atualiza dicionário com pares chave/valor de other, sobrescrevendo chaves existentes. Retorna None
.
update()
aceita tanto outro objeto do tipo dicionário ou um iterador de pares chave/valor (como tuplas ou outros iteráveis de tamanho dois). Se pares são passados como argumento, o dicionário é atualizado com aqueles pares:d.update(red=1, blue=2)
.
Assim, para fundir os dois dicionários acima, podemos digitar o seguinte:
dict2.update(dict1)
Digamos que você digitou a declaração abaixo para visualizar os resultados:
print dict2.update(dict1)
Nesse caso, será retornado None
! Isso se dá porque a função update()
não retorna um novo dicionário. Para obter o resultado da concatenação, digite o seguinte:
print dict2
Nesse caso, você verá o seguinte resultado:
{'bookA': 1, 'bookB': 2, 'bookC': 3, 'bookD': 4, 'bookE': 5}
E se fizéssemos o seguinte?
dict1.update(dict2) print dict1
Neste caso, obteríamos o seguinte resultado:
{'bookA': 1, 'bookB': 2, 'bookC': 2, 'bookD': 4, 'bookE': 5}
Note que, no primeiro caso, dict2.update(dict1)
, atualizamos dict2
com os pares chave/valor de dict1
e sobrescrevemos os pré-existentes nele: A chave existente, como percebemos, é 'bookC'
, que terá o valor 3
nesse caso, já que estamos atualizando com os pares chave/valor vindos de dict1
. Acontecerá o contrário no segundo caso, dict1.update(dict2)
, onde atualizaremos dict1
com os pares chave/valor de dict2
.
Entretanto, há um problema ao usar update()
para fundir dois dicionários. O problema está no fato do dicionário original ser modificado. Em outras palavras, no primeiro caso, por exemplo, dict2.update(dict1)
, a versão original de dict2
seria modificada, e no segundo caso, dict1.update(dict2)
, a versão original de dict1
seria modificada. Isso quer dizer que podemos usar update()
para fundir dois dicionários se não precisarmos manter a versão original do dicionário que queremos atualizar. Por versão original, quero dizer manter o par chave/valor.
Fundindo Dois Dicionário em uma Única Expressão
Outro método que podemos usar para fundir dois dicionários, podendo fazê-lo em uma única expressão, é o seguinte:
print dict(dict2, **dict1)
O retorno dessa declaração é:
{'bookA': 1, 'bookB': 2, 'bookC': 3, 'bookD': 4, 'bookE': 5}
Assim, dict1
sobrescreve dict2
. Se quisermos que dict2
sobrescreva dict1
, digitamos:
print dict(dict1, **dict2)
O retorno, nesse caso, seria:
{'bookA': 1, 'bookB': 2, 'bookC': 2, 'bookD': 4, 'bookE': 5}
Mantendo Valores de Chaves
Retornando ao problema sobre manter valores de chaves, como podemos fundir dois dicionários e manter os valores originais de cada um?
Um saída para isso pode ser a seguinte (obtida de uma resposta nesse tópico do StackOverflow):
from itertools import chain from collections import defaultdict dict1 = {'bookA': 1, 'bookB': 2, 'bookC': 3} dict2 = {'bookC': 2, 'bookD': 4, 'bookE': 5} dict3 = defaultdict(list) for k, v in chain(dict1.items(), dict2.items()): dict3[k].append(v) for k, v in dict3.items(): print(k, v)
O retorno seria esse, nesse caso:
('bookA', [1]) ('bookB', [2]) ('bookC', [3, 2]) ('bookD', [4]) ('bookE', [5])
Como pode ver nessa dica rápida, é muito fácil fundir dois dicionários usando Python, mas fica bem complicado se quisermos manter os valores de chaves iguais de cada dicionário.
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Update me weeklyEnvato Tuts+ tutorials are translated into other languages by our community members—you can be involved too!
Translate this post