Pular para o conteúdo

    Capítulo 21, Básico

    Dicionários

    O dicionário associa chaves a valores e é a estrutura mais poderosa da linguagem. Ele aparece em toda parte, de configurações a respostas de API.

    Código deste capítulo: basico/cap21_dicionarios.py

    Chaves e valores

    Um dicionário guarda pares chave: valor. Desde o Python 3.7, ele preserva a ordem de inserção. As chaves precisam ser hashable (strings, números, tuplas) e únicas:

    basico/cap21_dicionarios.pylinhas 10 a 15
    pessoa = {"nome": "Ana", "idade": 30}
    print(pessoa["nome"])
    pessoa["cidade"] = "Recife"
    pessoa["idade"] = 31
    del pessoa["nome"]
    print(pessoa)
    
    Saída
    Ana
    {'idade': 31, 'cidade': 'Recife'}
    

    Acessar com segurança

    Ler uma chave que não existe levanta KeyError. O método get devolve um valor padrão no lugar, e o operador in pergunta se a chave existe:

    basico/cap21_dicionarios.pylinhas 20 a 26
    try:
        pessoa["email"]
    except KeyError as erro:
        print("KeyError:", erro)
    print(pessoa.get("email"))
    print(pessoa.get("email", "sem email"))
    print("idade" in pessoa)
    
    Saída
    KeyError: 'email'
    None
    sem email
    True
    

    Percorrer e alterar

    basico/cap21_dicionarios.pylinhas 31 a 39
    estoque = {"maçã": 10, "pera": 0, "uva": 25}
    for fruta, quantidade in estoque.items():
        print(f"{fruta}: {quantidade}")
    print(list(estoque.keys()))
    print(list(estoque.values()))
    estoque.update({"pera": 5, "kiwi": 3})
    print(estoque.pop("kiwi"))
    print(estoque.setdefault("manga", 0))
    print(estoque)
    
    Saída
    maçã: 10
    pera: 0
    uva: 25
    ['maçã', 'pera', 'uva']
    [10, 0, 25]
    3
    0
    {'maçã': 10, 'pera': 5, 'uva': 25, 'manga': 0}
    

    Para juntar dois dicionários, o operador | (Python 3.9 ou superior) e o desempacotamento com ** dão o mesmo resultado, e em caso de chave repetida vence o da direita:

    basico/cap21_dicionarios.pylinhas 41 a 44
    a = {"x": 1, "y": 2}
    b = {"y": 20, "z": 30}
    print(a | b)
    print({**a, **b})
    
    Saída
    {'x': 1, 'y': 20, 'z': 30}
    {'x': 1, 'y': 20, 'z': 30}
    

    Contar e agrupar

    Contar ocorrências é uma das tarefas mais comuns. A versão manual usa get. A biblioteca padrão tem ferramentas prontas, Counter e defaultdict:

    basico/cap21_dicionarios.pylinhas 49 a 64
    from collections import Counter, defaultdict
    
    palavras = ["a", "b", "a", "c", "b", "a"]
    
    contagem = {}
    for palavra in palavras:
        contagem[palavra] = contagem.get(palavra, 0) + 1
    print(contagem)
    
    print(Counter(palavras))
    print(Counter(palavras).most_common(1))
    
    por_inicial = defaultdict(list)
    for nome in ["Ana", "Alice", "Bia", "Caio", "Beto"]:
        por_inicial[nome[0]].append(nome)
    print(dict(por_inicial))
    
    Saída
    {'a': 3, 'b': 2, 'c': 1}
    Counter({'a': 3, 'b': 2, 'c': 1})
    [('a', 3)]
    {'A': ['Ana', 'Alice'], 'B': ['Bia', 'Beto'], 'C': ['Caio']}
    

    Dados aninhados

    Dicionários e listas se combinam livremente. É assim que chegam os dados de uma API em JSON:

    basico/cap21_dicionarios.pylinhas 69 a 79
    pedido = {
        "cliente": "Ana",
        "itens": [
            {"produto": "caneta", "qtd": 2},
            {"produto": "caderno", "qtd": 1},
        ],
    }
    total_itens = 0
    for item in pedido["itens"]:
        total_itens += item["qtd"]
    print(total_itens)
    
    Saída
    3
    

    Exercício 1

    Frequência de cada elemento

    Escreva frequencia(itens) que devolva um dicionário com a contagem de cada item, sem usar Counter.

    Exercício 2

    Somar dicionários

    Escreva somar_dicts(d1, d2) que junte os dois somando os valores das chaves em comum. Para {"a": 5, "b": 3} e {"b": 4, "c": 2}, o resultado é {"a": 5, "b": 7, "c": 2}.