Pular para conteúdo

9. Listas: guardar muitos valores

Nesta aula

Ideia central: até aqui, cada variável guardava um valor só — a próxima medição sempre apagava a anterior. A lista guarda vários valores sob um nome só, na ordem em que entraram, e o for que você já conhece passa a visitar cada um deles.

Ao fim você vai conseguir: criar uma lista com []; acessar um item pelo índice, sabendo que ele começa em zero; medir o tamanho com len; adicionar itens com append; e escolher entre percorrer os valores de uma lista ou as suas posições.

O problema que a lista resolve

Na Unidade 3 você processou valor por valor: o laço lia um consumo, somava ao total e esquecia o valor assim que a próxima volta começava. Isso resolve "qual é o total" — mas não resolve "qual foi o maior consumo do mês" nem "quais dias especificamente passaram da meta", porque quando o programa termina de somar, os valores individuais já sumiram.

A lista guarda os valores enquanto o programa ainda precisar deles.

Criando uma lista com []

# Lista criada com colchetes; cada item tem um indice, comecando em 0.
franquias = [10, 20, 40, 100]

print("Plano 1 (indice 0):", franquias[0], "GB")
print("Plano 4 (indice 3):", franquias[3], "GB")
print("Total de planos:", len(franquias))
Plano 1 (indice 0): 10 GB
Plano 4 (indice 3): 100 GB
Total de planos: 4

Os colchetes [] criam a lista; as vírgulas separam os itens. franquias é uma variável que guarda quatro valores.

💡 Pense assim: a estante de gavetas numeradas

Uma lista é uma estante com gavetas em fila, cada uma com um número colado na frente. Você não pergunta "cadê o valor?" — você pergunta "o que tem na gaveta 2?". len(lista) é só a contagem de quantas gavetas a estante tem.

Índices começam em zero

A mesma contagem do range, agora numa lista inteira: o primeiro item é lista[0], não lista[1].

Expressão Item Valor
franquias[0] primeiro 10
franquias[1] segundo 20
franquias[3] quarto e último 100

Uma lista de 4 itens tem índices válidos de 0 a 3 — nunca 4. Pedir um índice que não existe é um dos erros que o Python denuncia, na hora:

# A lista tem 4 itens: indices validos vao de 0 a 3.
franquias = [10, 20, 40, 100]
print(franquias[4])
IndexError: list index out of range

IndexError: list index out of range — "índice fora do alcance". Diferente do erro silencioso que este semestre vem perseguindo, este pelo menos avisa. Guarde a mensagem: você vai encontrá-la de novo assim que esquecer que a contagem começa em zero.

len: quantos itens tem a lista

len(franquias) devolveu 4 no primeiro exemplo. É a mesma função que já media o tamanho de um texto — agora conta itens em vez de caracteres. E é len(lista), nunca len(lista) - 1: o índice do último item é len(lista) - 1, mas o tamanho é len(lista). Confundir os dois é o erro mais comum deste capítulo.

Percorrendo o valor: for x in lista

Quando você só precisa ler cada item, sem saber em que posição ele está:

# for x in lista: da o VALOR de cada item, na ordem em que estao guardados.
consumo_gb = [4.2, 1.8, 5.0, 0.9, 3.3]

for consumo in consumo_gb:
    print(f"Consumo do dia: {consumo} GB")
Consumo do dia: 4.2 GB
Consumo do dia: 1.8 GB
Consumo do dia: 5.0 GB
Consumo do dia: 0.9 GB
Consumo do dia: 3.3 GB

É a mesma leitura do capítulo 8, agora sobre uma lista: "para cada consumo em consumo_gb, faça isto". A variável recebe o valor de cada item, do primeiro ao último, e o índice nunca aparece.

Percorrendo o índice: for i in range(len(lista))

for x in lista não serve para tudo. Se você precisa mudar um valor que já está na lista, ou rotular a posição de cada item, precisa do índice — e o valor sozinho não diz onde ele mora.

# for i in range(len(lista)): da a POSICAO -- use quando precisar mudar um
# valor que ja existe na lista, ou rotular a posicao de cada item.
patrimonio = [1200.0, 850.0, 300.0]

for i in range(len(patrimonio)):
    patrimonio[i] = patrimonio[i] * 1.05  # reajuste de 5% no valor do equipamento

for i in range(len(patrimonio)):
    print(f"Equipamento {i + 1}: R$ {patrimonio[i]:.2f}")
Equipamento 1: R$ 1260.00
Equipamento 2: R$ 892.50
Equipamento 3: R$ 315.00

Dois laços, dois motivos para usar o índice:

  • o primeiro muda cada item da própria lista (patrimonio[i] = ...); for valor in patrimonio não conseguiria fazer isso — valor é uma cópia, mudar valor não muda a lista;
  • o segundo usa i só para rotular a saída (Equipamento {i + 1}), sem alterar nada.
Você quer Use
só ler cada valor, na ordem for item in lista:
mudar um valor que já existe na lista for i in range(len(lista)):
numerar ou rotular a posição de cada item for i in range(len(lista)):

💡 Pense assim: o valor é a carta, o índice é o endereço

for item in lista te entrega a carta aberta — você lê o conteúdo, mas não sabe de qual caixa de correio ela veio. for i in range(len(lista)) te dá o número da caixa; a carta você busca com lista[i], e pode até trocá-la por outra.

append: construindo a lista aos poucos

Nem sempre os valores existem antes do laço começar — às vezes eles vêm do teclado, um a um, e a lista começa vazia.

# Uma lista vazia nao e um erro -- e o ponto de partida do append.
leituras = []
print("Leituras registradas ate aqui:", len(leituras))

for dia in range(1, 5):
    consumo = float(input(f"Consumo do dia {dia} em GB: "))
    leituras.append(consumo)

print("Lista final:", leituras)
print("Total de leituras:", len(leituras))

Digitando 2.1, 3.4, 1.0 e 4.4, a sessão fica assim:

Leituras registradas ate aqui: 0
Consumo do dia 1 em GB: 2.1
Consumo do dia 2 em GB: 3.4
Consumo do dia 3 em GB: 1.0
Consumo do dia 4 em GB: 4.4
Lista final: [2.1, 3.4, 1.0, 4.4]
Total de leituras: 4

leituras = [] cria a lista vazia — e uma lista vazia não é um erro: len(leituras) vale 0, e é exatamente isso que o programa imprime antes do primeiro input(). Cada leituras.append(consumo) acrescenta um item no fim da lista, um a cada volta do laço.

append sempre no fim

lista.append(x) não pede posição: x sempre entra depois do último item que já estava lá. Para trocar um item que já existe, é lista[i] = x — o do índice, não o append.

A lista vazia não trava nada

Se o laço acima desse zero voltas — nenhum input() chamado — leituras continuaria [], e len(leituras) continuaria 0. Um for sobre uma lista vazia se comporta como range(0), lá do capítulo 8: o programa não reclama de nada, simplesmente não executa o corpo do laço nenhuma vez. Se um trecho seu "não fez nada" com uma lista, a primeira suspeita é essa: ela chegou vazia até ali.

Erros comuns deste capítulo

Mensagem ou sintoma Causa provável
IndexError: list index out of range pediu um índice que não existe — lembre que o último é len(lista) - 1
o primeiro item não é o que você esperava esqueceu que lista[0] é o primeiro, não lista[1]
mudou o valor mas a lista não mudou usou for item in lista para tentar alterar item; precisa de for i in range(len(lista)) e lista[i] = ...
append colocou o item no lugar errado append sempre bota no fim; para outra posição, é lista[i] = valor
o laço "não fez nada" a lista chegou vazia até o for
TypeError: 'list' object is not callable tentou indexar com parênteses, lista(2), em vez de colchetes, lista[2]

Resumo

  • lista = [v1, v2, v3] cria uma lista; lista = [] cria uma vazia.
  • O índice começa em zero. O último item de uma lista com n elementos está em lista[n - 1].
  • len(lista) devolve a quantidade de itens — não o último índice.
  • lista.append(x) acrescenta x no fim da lista.
  • for item in lista: te dá o valor. for i in range(len(lista)): te dá a posição, e é o único jeito de mudar um valor que já está lá.

Para praticar

Lista 09 · Listas.

Você já sabe criar, ler e montar uma lista. O que falta é o que fazer com ela: somar, contar, achar o maior, separar o que interessa. É a próxima aula.