Python Tricks: Guia Completo de Dictionary Merge
Descubra todas as técnicas para mesclar dicionários em Python, dos métodos clássicos ao operador | do Python 3.9. Aprenda a lidar com conflitos de chaves e a mesclar dicionários aninhados.
InSkillCoach
Python Tricks: Guia Completo de Dictionary Merge
Os dicionários são uma das estruturas de dados mais poderosas do Python. Mesclar dicionários é uma operação comum, e existem várias maneiras de fazer isso. Neste guia, vamos explorar todas as técnicas disponíveis, das mais básicas às mais avançadas.
1. Métodos Clássicos de Mesclagem
O método update()
O método mais tradicional para mesclar dicionários é o update():
dict1 = {'a': 1, 'b': 2}
dict2 = {'c': 3, 'd': 4}
dict1.update(dict2)
print(dict1) # {'a': 1, 'b': 2, 'c': 3, 'd': 4}
Unpacking com **
Uma abordagem mais moderna usa o operador de desempacotamento **:
dict1 = {'a': 1, 'b': 2}
dict2 = {'c': 3, 'd': 4}
merged = {**dict1, **dict2}
print(merged) # {'a': 1, 'b': 2, 'c': 3, 'd': 4}
2. O Novo Operador | (Python 3.9+)
O Python 3.9 introduziu um novo operador para mesclar dicionários:
dict1 = {'a': 1, 'b': 2}
dict2 = {'c': 3, 'd': 4}
merged = dict1 | dict2
print(merged) # {'a': 1, 'b': 2, 'c': 3, 'd': 4}
# Versão com atribuição
dict1 |= dict2 # Equivalente a dict1.update(dict2)
3. Tratamento de Conflitos de Chaves
O que fazer quando os dicionários compartilham chaves em comum?
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
# O último valor prevalece
merged = dict1 | dict2
print(merged) # {'a': 1, 'b': 3, 'c': 4}
# Solução personalizada
def merge_with_max(d1, d2):
return {k: max(d1.get(k, 0), d2.get(k, 0)) for k in set(d1) | set(d2)}
merged_max = merge_with_max(dict1, dict2)
print(merged_max) # {'a': 1, 'b': 3, 'c': 4}
4. Mesclagem de Dicionários Aninhados
A mesclagem de dicionários aninhados exige uma abordagem mais sofisticada:
def deep_merge(dict1, dict2):
merged = dict1.copy()
for key, value in dict2.items():
if key in merged and isinstance(merged[key], dict) and isinstance(value, dict):
merged[key] = deep_merge(merged[key], value)
else:
merged[key] = value
return merged
dict1 = {'a': 1, 'b': {'x': 10, 'y': 20}}
dict2 = {'c': 3, 'b': {'y': 30, 'z': 40}}
merged = deep_merge(dict1, dict2)
print(merged) # {'a': 1, 'b': {'x': 10, 'y': 30, 'z': 40}, 'c': 3}
5. Boas Práticas e Dicas
-
Desempenho: Para dicionários pequenos, todos os métodos são equivalentes em termos de desempenho. Para dicionários grandes,
update()costuma ser mais rápido. -
Legibilidade: O operador
|(Python 3.9+) oferece a sintaxe mais clara e concisa. -
Imutabilidade: Se você não quiser modificar os dicionários originais, use o operador
|ou o desempacotamento com**. -
Tipos: Certifique-se de que os valores sejam compatíveis durante a mesclagem, principalmente com dicionários aninhados.
6. Casos de Uso Avançados
Mesclagem de Vários Dicionários
dicts = [{'a': 1}, {'b': 2}, {'c': 3}]
# Método com |
merged = {}
for d in dicts:
merged |= d
# Alternativa com reduce
from functools import reduce
merged = reduce(lambda x, y: x | y, dicts)
Mesclagem Condicional
def conditional_merge(dict1, dict2, condition):
return {
k: v for k, v in (dict1 | dict2).items()
if condition(k, v)
}
# Exemplo: manter apenas os valores positivos
merged = conditional_merge(
{'a': 1, 'b': -2},
{'c': 3, 'd': -4},
lambda k, v: v > 0
)
print(merged) # {'a': 1, 'c': 3}
Recursos Adicionais
Sobre InSkillCoach
Especialista em treinamento e tecnologias
Coach especializado em tecnologias avançadas e IA, apoiado pela GNeurone Inc.
Certificações:
- AWS Certified Solutions Architect – Professional
- Certificações Google Cloud
- Microsoft Certified: DevOps Engineer Expert
- Certified Kubernetes Administrator (CKA)
- CompTIA Security+
Comentários
Os comentários são alimentados pelo GitHub Discussions
Conecte-se com o GitHub para participar da discussão