0%
Python Tricks: Guia Completo de Dictionary Merge

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.

I

InSkillCoach

· min

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

  1. 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.

  2. Legibilidade: O operador | (Python 3.9+) oferece a sintaxe mais clara e concisa.

  3. Imutabilidade: Se você não quiser modificar os dicionários originais, use o operador | ou o desempacotamento com **.

  4. 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

InSkillCoach

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+
1.7k
106

Comentários

Os comentários são alimentados pelo GitHub Discussions

Conecte-se com o GitHub para participar da discussão

Link copiado!