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))
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 — "í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}")
Dois laços, dois motivos para usar o índice:
- o primeiro muda cada item da própria lista (
patrimonio[i] = ...);for valor in patrimonionão conseguiria fazer isso —valoré uma cópia, mudarvalornão muda a lista; - o segundo usa
isó 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
nelementos está emlista[n - 1]. len(lista)devolve a quantidade de itens — não o último índice.lista.append(x)acrescentaxno 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¶
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.