• Python
  • 10. Armazenamento de chaves e valores em dicionários

Indo Além - Listas e Dicionários#

Dicionários e listas são estruturas complexas e por conta disso é fácil usá-las de maneira confusa. Veremos aqui mais 3 padrões que ajudam a escrever código mais sucinto e direto.

Padrão 1 - acesso via índice ou elemento#

No código abaixo percorremos uma lista e fazemos a soma de seus elementos. Leia-o com atenção.

# l é uma lista com números
soma = 0
for i in range(len(l)):
    soma += l[i]

...

O for passa por todo índice i válido da lista, porém i sempre é usado para obter o i-ésimo elemento de l (l[i]). Neste caso podemos fazer um for mais simples que só percorre todos os elementos da lista. Veja abaixo

# l é uma lista com números
soma = 0
for num in l:
    soma += num

...

Padrão 2 - iteração em dicionários usando items()#

Veja o código abaixo. Ele mostra o valor de toda chave que começa to a letra a.

# d é um dicionário com chaves string e valores int
for k, v for d.items():
    if k[0] == 'a':
        print(d[k])

....

Quanto usamos d.items() já recebemos uma tupla com a chave k e o valor v correspondente. Logo, na linha #!print(d[k]) não precisamos novamente buscar d[k]! Basta usar #!print(v).

Apesar de simples, essa mudança pode fazer a diferença se usarmos nomes de variáveis bons. Veja abaixo:

# dados é um dicionário com chaves string e valores int
for nome, idade in dados.items():
    if nome[0] == 'a':
        print(idade)

Não só melhoramos a legibilidade como deixamos claro que usaremos no loop tanto a chave nome quanto o valor correspondente idade.

Atenção: se for usar só as chaves pode fazer o loop for chave in dados.keys() ou for chave in dados (o padrão é percorrer as chaves). Se for usar só os valores pode usar for valor in dados.values().

Padrão 3 - modificar lista durante iteração#

Vamos usar como exemplo o código abaixo.

l = [1, 2, 3, 4, 5, 6, 7]

for i in range(len(l)):
    if l[i] % 2 == 0: del l[i]

print(l)

Exercício 1

Tente executá-lo. Ele funciona? Se não, consegue explicar o erro que acontece?

Resposta

O tamanho da lista é modificado dentro do `for`, mas o loop sempre roda até o tamanho original da lista. Como ela diminui de tamanho isso faz o programa dar erro pois tentamos acessar um índice inexistente.

Uma regra importante com listas é a seguinte: se desejamos mudar seu tamanho durante a iteração então criamos uma nova lista. Por exemplo, no caso acima só adicionaríamos na lista nova se l[i] % 2 != 0. Veja abaixo o código corrigido.

nova_lista = []
for val in l:
    if val % 2 != 0:
        nova_lista.append(val)

Note que agora nem precisamos mais do índice i e podemos usar direto os elementos da lista. O mesmo vale para quando queremos adicionar novos elementos durante a iteração: criamos uma lista nova e adicionamos tanto os originais quanto os novos.

Hora de praticar#

Acesse os exercícios de refatoração no PrairieLearn e use os padrões acima para melhorar o código disponibilizado nos exercícios.