Juntar 2 Dicionários

463 views
Skip to first unread message

Aron Stall

unread,
May 11, 2014, 2:49:14 PM5/11/14
to python...@googlegroups.com
Tenho 2 dicionarios, um com essas informações:

{'Ex1': 'Teste', 'Ex2': 10}

e o outro assim:

{'Ex3': 'Teste2', 'Ex4': 'Teste3'}

E tenho que formar um novo dicionario assim:

{'Ex1': 'Teste', 'Ex2': 10, 'Ex4': 'Teste3'}

Como faço para somar os 2 dicionarios, eliminando o EX3, para criar um desse jeito, espero que entendam.

Cloves Oliveira

unread,
May 11, 2014, 3:12:04 PM5/11/14
to Python Brasil
Não se se te servirá pra o que vc deseja, mas tenta adicionar os valores de um no outro e removendo o que vc não deseja

Ex.:

dic1 = {1 : 11, 2 : 22}
dic2 = {3 : 33, 4 : 44}

dic1.update(dic2)
dic1 = {1 : 11, 2 : 22, 3 : 33, 4 : 44}

dic1.pop(3)
dic1 = {1 : 11, 2 : 22, 4 : 44}


Cloves Oliveira dos Santos
Graduando em Ciência da Computação
Universidade Federal de Alagoas - Campus Arapiraca
Currículo Lattes



Date: Sun, 11 May 2014 11:49:14 -0700
From: aronk...@gmail.com
To: python...@googlegroups.com
Subject: [python-brasil] Juntar 2 Dicionários
--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito no grupo quot;Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Elyézer Rezende

unread,
May 12, 2014, 1:00:21 PM5/12/14
to Lista Python Brasil
Lembre-se que o update irá atualizar o valor de chaves que já tenham sido cridas, ex:

>>> d = {'a': 10}
>>> d.update({'a': 12})
>>> d
{'a': 12}

Abraço
--
Elyézer Rezende
http://elyezer.com

Danilo J. S. Bellini

unread,
May 12, 2014, 2:06:40 PM5/12/14
to python-brasil
Há outras maneiras de fazer isso além do dict.update com dict.pop...Mas a parte que me parece mais relevante é evitar a alteração dos dicionários originais, para caso estes sejam utilizados em outros contextos. Usando:

d1 = {'Ex1': 'Teste', 'Ex2': 10}
d2 = {'Ex3': 'Teste2', 'Ex4': 'Teste3'}

Algumas maneiras de obter um "d3" que é a união dos dicionários sem o mapeamento da chave "Ex3", sem alterar os dicionários originais:

# Ainda com o update, Python 2 e 3
d3 = d1.copy()
d3.update(d2)
del d3["Ex3"] # A diferença é que dict.pop("Ex3") retorna/devolve o valor removido

# Python 2
d3 = dict(d1.items() + d2.items()) # Concatenação de listas
del d3["Ex3"]

# Python 3 (embora também funcione no Python 2)
from itertools import chain
d3 = dict(chain(d1.items(), d2.items())) # Concatenação de iteráveis quaisquer (deferred/lazy)
del d3["Ex3"]

# Python 2 com o método iteritems()
from itertools import chain
d3 = dict(chain(d1.iteritems(), d2.iteritems()))

# Sem querer usar um statement como o "del", deixando isso tudo como uma única expressão:
from itertools import chain
d3 = {k: v for k, v in chain(d1.items(), d2.items()) if k != "Ex3"}

# Até o import poderia ser uma expressão...
d3 = {k: v for k, v in __import__("itertools").chain(d1.items(), d2.items()) if k != "Ex3"}

# Com a função "iteritems" do six para compatibilidade entre Python 2 e 3.
from itertools import chain
from six import iteritems
d3 = {k: v for k, v in chain(iteritems(d1), iteritems(d2)) if k != "Ex3"}

# Com map, o chain.from_iterable só avalia iteritems(d2) depois de percorrer d1
from itertools import chain
from six import iteritems
from six.moves import map # itertools.imap no Python 2; built-in map no Python 3
d3 = {k: v for k, v in chain.from_iterable(map(iteritems, [d1, d2])) if k != "Ex3"}

# Se quiser avaliar todos os iteritems antes, não precisa se preocupar com a diferença dos "maps"
from itertools import chain
from six import iteritems
d3 = {k: v for k, v in chain(*map(iteritems, [d1, d2])) if k != "Ex3"}

# Generator expression ao invés do map
from itertools import chain
from six import iteritems
d3 = {k: v for k, v in chain.from_iterable(iteritems(d) for d in [d1, d2]) if k != "Ex3"}

# Caso "Ex3" não seja a única chave a ser deixada de lado, o "not in" pode ajudar:
from itertools import chain
from six import iteritems
d3 = {k: v for k, v in chain(*map(iteritems, [d1, d2])) if k not in ["Ex3"]}

# AudioLazy =D (poderia ser o xmap no lugar do imap)
from audiolazy import imap, iteritems, chain
d3 = {k: v for k, v in chain.from_iterable(imap(iteritems, [d1, d2])) if k not in ["Ex3"]}

# Lambda (o chain poderia ser o do itertools e o iteritems do six)
from audiolazy import chain, iteritems
mix_dict = lambda dicts, inv_keys=[]: {k: v for k, v in chain.from_iterable(iteritems(d) for d in dicts) if k not in inv_keys}
d3 = mix_dict([d1, d2], ["Ex3"])

# A mesma função sem a sintaxe como expressão (def ao invés de lambda)
from audiolazy import chain, iteritems
def mix_dict(dicts, inv_keys=[]):
return {k: v for k, v in chain.from_iterable(iteritems(d) for d in dicts) if k not in inv_keys}
d3 = mix_dict([d1, d2], ["Ex3"])

Danilo J. S. Bellini
---------------
"It is not our business to set up prohibitions, but to arrive at conventions." (R. Carnap)
Reply all
Reply to author
Forward
0 new messages