Dicionários e Conjuntos

Dicionários em Python

Dicionários são estruturas de dados que permitem armazenar pares de chave-valor. Em Python, dicionários são delimitados por chaves {}. As strings, listas e tuplas utilizam inteiros como indices. Se voce tentar utilizar qualquer outro tipo como indice, voce receberá um erro. O dicionario vai nos ajudar nisso.

Criação de Dicionários

Dicionários são criados usando chaves {}, contendo pares chave-valor separados por dois pontos :.

meu_dict = dict()    # primeira forma de inicializar um dicionario
meu_dict = {}        # segunda forma de inicializar um dicionario
Podemos inicializar um dicionário com valores

pessoa = {"nome": "Alice", "idade": 30, "profissão": "Engenheira"}

Qual alternativa indica um dicionário?

Acesso a Elementos

Para acessar o valor associado a uma chave, use a chave como índice.

pessoa = {"nome": "Alice", "idade": 30, "profissão": "Engenheira"}

print(pessoa["idade"])  # Saída: 30

Se tentarmos acessar uma chave que não existe, obteremos um KeyError.

Qual é a saída do código a seguir?

    d = {"a": 1, "b": 2, "c": 3}
    print(d["b"])

Adição, Remoção e Alteração de Elementos

Dicionários em Python são mutáveis, o que significa que você pode adicionar, alterar ou remover pares chave-valor após sua criação.

Adição

Para adicionar um novo par chave-valor a um dicionário, você simplesmente atribui um valor a uma nova chave:

pessoa = {}
pessoa["nome"] = "Carlos"

Após executar o código acima, o dicionário pessoa conterá {"nome": "Carlos"}.

Alteração

Se você atribuir um valor a uma chave já existente, o valor anterior associado a essa chave será substituído:

pessoa["nome"] = "Roberto"
Agora, o dicionário pessoa foi atualizado para {"nome": "Roberto"}.

O método update() é usado para inserir pares chave-valor de um dicionário em outro dicionário. Se a chave já existir no dicionário original, o valor para essa chave será atualizado. Se a chave não existir, o par chave-valor será adicionado.

Remoção

Para remover um par chave-valor de um dicionário, você pode usar a instrução del seguida da chave que deseja remover:

del pessoa["nome"]
Após a execução deste código, a chave "nome" e seu valor associado serão removidos do dicionário pessoa, deixando-o vazio.

Qual é a saída do código a seguir?

dados = {
    "alunos": {
        "Ana": {"idade": 20, "curso": "Engenharia"},
        "Pedro": {"idade": 25, "curso": "Matemática"},
    },
    "professores": {
        "Dr. Silva": {"idade": 40, "disciplina": "Física"},
        "Dra. Fernanda": {"idade": 35, "disciplina": "Química"},
    },
}
print(dados["alunos"]["Pedro"]["curso"])

Qual é a saída do código a seguir?

d1 = {"a": 1, "b": 2, "c": 3} 
d2 = {"b": 3, "c": 4, "d": 5}

d1.update(d2) 

Métodos mais utilizados de Dicionários

Os dicionários possuem uma série de métodos incorporados que facilitam a manipulação e interação com os dados. Vamos abordar alguns dos métodos mais usados:

  • keys(): Retorna uma lista de todas as chaves.
  • values(): Retorna uma lista de todos os valores.
  • items(): Retorna uma lista de tuplas (chave, valor).
  • get(key, default): Retorna o valor para a chave especificada ou o valor default.

Vamos usar o dicionario d neste exemplo:

d = {"nome": "Alice", "idade": 31, "nacionalidade": "Brasileira"}

keys()

d = {"nome": "Alice", "idade": 31, "nacionalidade": "Brasileira"}
print(d.keys())  # Saída: dict_keys(['nome', 'idade', 'nacionalidade'])

value()

print(d.values())  # Saída: dict_values(['Alice', 31, 'Brasileira'])

items()

# Jeito simples
print(d.items()) 

get()

O método get() é uma maneira segura de acessar os valores de um dicionário. Se a chave especificada não for encontrada, ele retorna o valor default especificado (ou None se nenhum valor default for fornecido).

cidade = d.get("cidade", "Não especificado")
print(cidade)  # Saída: Não especificado
!!! Tip Note que usar d["cidade"] diretamente causaria um KeyError, mas com get(), evitamos esse erro e temos uma saída controlada.

Dado o dicionário:
produtos = {
    "maçã": {"preço": 0.5, "estoque": 100},
    "banana": {"preço": 0.3, "estoque": 50},
    "cereja": {"preço": 2.0, "estoque": 20}
}
Qual será a saída do código a seguir?

print(produtos.get("pêssego", {}).get("preço", "Produto não encontrado"))

Considerando o seguinte dicionário:
alunos = {
    "Ana": [8.5, 9.0, 7.5],
    "Pedro": [6.0, 7.0, 8.0],
    "Mariana": [9.5, 8.5, 9.0]
}
Após executar o código abaixo, qual será a saída?

notas = alunos.get("Ana") 
media = sum(notas) / len(notas)
print(media)

Iterando em Dicionários

Podemos iterar pelas chaves, valores ou pares chave-valor de um dicionário.

Considerando o dicionário pessoa:

pessoa = {"nome": "Alice", "idade": 30, "profissão": "Engenheira"}
for chave in pessoa.keys():
    print(chave)

for valor in pessoa.values():
    print(valor)

for chave, valor in pessoa.items():
    print(chave, ":", valor)

!!! Tip Ao usar o método items() em um dicionário e desempacotar os resultados em chave e valor, você obtém acesso direto a ambos os componentes do par chave-valor durante a iteração.

Aninhamento em Dicionários

Podemos encontrar estruturas de Dicionários que conter outros dicionários, um conceito conhecido como aninhamento. Isso é especialmente útil quando se deseja representar informações estruturadas de forma hierárquica.

Por exemplo, suponha que queremos representar informações sobre uma pessoa, incluindo seu endereço:

pessoa = {
    "nome": "Alice",
    "idade": 30,
    "endereço": {
        "rua": "Av. Central",
        "número": 123,
        "cidade": "Campinas",
        "estado": "SP"
    }
}

Para acessar informações aninhadas, você pode encadear os índices:

print(pessoa["endereço"]["cidade"])  # Saída: Campinas

!!! Tip Dicionários aninhados são comuns ao trabalhar com dados estruturados, como arquivos JSON.

Listas de Dicionários

Listas de dicionários são uma estrutura de dados comum em Python. Elas permitem armazenar um conjunto de registros, onde cada registro é um dicionário com pares chave-valor.

Consideremos uma lista que representa uma série de produtos:

produtos = [
    {"nome": "camiseta", "preço": 29.99, "estoque": 100},
    {"nome": "calça", "preço": 59.99, "estoque": 50},
    {"nome": "tênis", "preço": 129.99, "estoque": 25}
]

Iterando pela Lista

Para iterar pela lista e acessar cada dicionário:

for produto in produtos:
    print(produto["nome"], "-", produto["preço"])

Adicionando um Novo Dicionário

Para adicionar um novo produto:

novo_produto = {"nome": "boné", "preço": 19.99, "estoque": 30}
produtos.append(novo_produto)

Atualizando um Dicionário

Para atualizar o preço do primeiro produto:

produtos[0]["preço"] = 24.99

Removendo um Dicionário

Para remover um produto da lista (por exemplo, o terceiro produto):

del produtos[2]

Ou, se você quiser remover um produto com base em um critério específico:

produtos = [produto for produto in produtos if produto["nome"] != "tênis"]

Este último exemplo utiliza list comprehension para criar uma nova lista, excluindo o produto cujo nome é "tênis".

Considerando a seguinte lista de dicionários:
biblioteca = [
    {
        "título": "Orgulho e Preconceito",
        "autor": "Jane Austen",
        "ano": 1813,
        "categoria": "Romance"
    },
    {
        "título": "1984",
        "autor": "George Orwell",
        "ano": 1949,
        "categoria": "Ficção distópica"
    },
    {
        "título": "Moby Dick",
        "autor": "Herman Melville",
        "ano": 1851,
        "categoria": "Aventura"
    }
]
Após executar o código abaixo, qual será a saída?

```python
resultado = [livro["título"] for livro in biblioteca if livro["categoria"] == "Romance"]
print(resultado)
```

Conjuntos em Python

Conjuntos são uma coleção de elementos únicos. Em Python, conjuntos são similares a listas ou dicionários, mas não podem ter elementos duplicados e não são ordenados.

Criação de Conjuntos

Conjuntos são criados usando chaves {} ou a função set().

moradia = set()

frutas = {"maçã", "banana", "cereja"}

!!! Tip Cuidado para não confundir conjunto com dicionario. Diferentemente dos dicionarios, os conjuntos não são ordenados e não possuem pares de chave-valor.

Operações com Conjuntos

Podemos realizar operações típicas de conjuntos, como união, interseção e diferença.

a = {1, 2, 3}
b = {3, 4, 5}
print(a | b)  # União: {1, 2, 3, 4, 5}
print(a & b)  # Interseção: {3}
print(a - b)  # Diferença: {1, 2}

Métodos mais utilizados de Conjuntos

  • add(elem): Adiciona um elemento ao conjunto.
  • remove(elem): Remove um elemento do conjunto.
  • pop(): Remove e retorna um elemento do conjunto.
  • clear(): Limpa todos os elementos do conjunto.
frutas.add("uva")
frutas.remove("banana")
print(frutas)  # Saída: {"maçã", "cereja", "uva"}

Iterando em Conjuntos

Assim como listas e dicionários, podemos iterar pelos elementos de um conjunto.

for fruta in frutas:
    print(fruta)

Considere os conjuntos `a` e `b` definidos abaixo. Qual é a saída do código?

a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a & b)