Python Acessando Itens
Na aula Listas, a Ana guardou a lista de compras inteira numa variável e mostrou tudo de uma vez. Mas, no mercado, ela quer saber um item: "qual é o primeiro da lista?", "e o último?", "em que posição está o café?". Nesta aula você aprende a pegar um item (ou um pedaço da lista) pela sua posição, o índice.
- O que é o índice de um item, e por que a contagem começa no 0.
- A pegar um item com
lista[posição]e a guardá-lo numa variável. - A pegar os últimos itens com índices negativos (
lista[-1]). - A pegar um pedaço da lista com uma fatia (
lista[1:3]). - A descobrir a posição de um item com
index()e a contar repetições comcount(). - A chegar num item de uma lista que está dentro de outra lista.
- Os erros reais:
IndexError, oValueErrordoindex()e o índice que veio doinput()como texto.
A ideia: os armários numerados
Pense nos armários de guardar bolsa na entrada do mercado. Ficam em fila, um do lado do outro, e cada um tem um número pintado na porta. Para pegar a sua bolsa, você não abre todos: vai direto no número certo.
A lista é essa fileira de armários, e cada item mora num deles. O número da porta é o índice (em inglês, index). Só tem um detalhe, que confunde todo mundo no começo: em Python, o primeiro armário é o número 0, e não o 1.
| Item | "arroz" | "feijão" | "café" | "leite" |
|---|---|---|---|---|
| Índice | 0 | 1 | 2 | 3 |
| Índice negativo | -4 | -3 | -2 | -1 |
Por que começar no 0? Pense no índice como "quantos passos andar a partir do começo". Para chegar no primeiro item, você anda 0 passos; para o segundo, 1 passo; e assim por diante. É a mesma regra das letras de um texto, que você viu na aula Índices e Fatias. Uma consequência importante: numa lista de 4 itens, o último índice é 3, e não 4.
1. Pegando um item pelo índice
compras = ["arroz", "feijão", "café", "leite"]
print(compras[0])
print(compras[1])
print(compras[3])
primeiro = compras[0]
print(f"Primeiro da lista: {primeiro}")
- compras
- A lista de onde você quer tirar o item.
- [
- Colado no nome da lista, sem espaço, o colchete agora quer dizer "o item da posição…". (Lembre:
[sozinho, depois do=, cria uma lista; colado no nome de uma lista, pega um item dela.) - 0
- O índice, sempre um número inteiro. Pode ser um número escrito direto ou uma variável que guarde um inteiro.
- ]
- Fecha o índice.
- primeiro = compras[0]
- O item é um valor como outro qualquer: dá para guardar numa variável, usar numa f-string, numa conta, num
if.
$ python3 posicoes.py arroz feijão leite Primeiro da lista: arroz
compras[0] é o arroz, o primeiro; compras[1] é o feijão, o segundo; compras[3] é o leite, o quarto e último. Repare que o print de um item sozinho mostra o texto sem aspas e sem colchetes: o que sai é o texto arroz, e não uma lista.
No dia a dia, a Ana diz "o café é o terceiro item". No Python, o café tem índice 2. As duas frases falam da mesma coisa, só que contam de jeitos diferentes. Para não se perder: índice = posição − 1.
2. Do fim para o começo: índices negativos
Quase sempre você quer o último item, mas nem sempre sabe quantos itens a lista tem. O Python resolve isso com índices negativos, que contam a partir do fim: -1 é o último, -2 é o penúltimo.
compras = ["arroz", "feijão", "café", "leite"] print(compras[-1]) print(compras[-2]) print(compras[len(compras) - 1])
$ python3 ultimo.py leite café leite
A última linha mostra o jeito "longo" de pegar o último item: len(compras) é 4, menos 1 dá 3, o último índice. Funciona, mas compras[-1] diz a mesma coisa de um jeito muito mais curto e claro. Pense no -1 como "um passo para trás a partir do fim". (Não existe -0 para o último: -0 é o mesmo que 0, o primeiro.)
Missão: o programa mostra o primeiro item. Troque o índice para mostrar o último item, usando um índice negativo.
compras = ["arroz", "feijão", "café", "leite", "sabão"] print(compras[0])
compras = ["arroz", "feijão", "café", "leite", "sabão"] print(compras[-1])
3. Um pedaço da lista: fatias
Às vezes a Ana quer mais de um item: "os dois primeiros", "do segundo ao terceiro". Para isso existe a fatia (em inglês, slice): lista[início:fim]. O resultado é uma nova lista, com os itens do índice início até o índice fim, sem incluir o fim.
>>> compras = ["arroz", "feijão", "café", "leite", "sabão"] >>> compras[1:3] ['feijão', 'café'] >>> compras[:2] ['arroz', 'feijão'] >>> compras[2:] ['café', 'leite', 'sabão'] >>> compras[-2:] ['leite', 'sabão'] >>> compras[:] ['arroz', 'feijão', 'café', 'leite', 'sabão']
| Fatia | Lê-se | Resultado |
|---|---|---|
compras[1:3] | Do índice 1 até antes do 3 (o 1 e o 2) | ['feijão', 'café'] |
compras[:2] | Do começo até antes do 2: os 2 primeiros | ['arroz', 'feijão'] |
compras[2:] | Do índice 2 até o fim | ['café', 'leite', 'sabão'] |
compras[-2:] | Do penúltimo até o fim: os 2 últimos | ['leite', 'sabão'] |
compras[:] | Do começo ao fim: a lista toda | Uma lista nova com todos os itens (veja a aula Copiando Listas) |
Por que o fim fica de fora? Porque assim a conta fecha: compras[1:3] tem 3 - 1 = 2 itens, e compras[:2] tem exatamente 2. Os números das fatias funcionam igualzinho aos de um texto (aula Índices e Fatias).
Item × fatia
Compare com cuidado:
>>> compras[0] 'arroz' >>> compras[0:1] ['arroz']
compras[0] (com um número só) devolve o item: o texto 'arroz'. compras[0:1] (com dois-pontos) devolve uma lista com um item só: ['arroz']. Os colchetes na saída mostram a diferença.
Fatias não dão erro
Uma fatia que passa do fim da lista não reclama: pega o que existe. E uma fatia que começa depois do fim devolve uma lista vazia:
>>> compras[3:100] ['leite', 'sabão'] >>> compras[10:20] []
Pulando itens: o passo
Um terceiro número, depois de mais um :, diz de quantos em quantos pegar. Com passo -1, a lista sai de trás para frente:
>>> compras[::2] ['arroz', 'café', 'sabão'] >>> compras[::-1] ['sabão', 'leite', 'café', 'feijão', 'arroz']
[::2] pega um sim, um não (os índices 0, 2 e 4). [::-1] é um jeito curto de ter a lista ao contrário; a aula Ordenando Listas mostra outros.
4. Onde está o café? index() e count()
Até aqui você sabia o índice e queria o item. E quando é o contrário: você sabe o item e quer o índice? A lista tem um método para isso, o index(). Um método é uma função que pertence ao valor e se escreve depois de um ponto: compras.index("café") quer dizer "lista de compras, me diga o índice do café".
compras = ["arroz", "feijão", "café", "leite"]
posicao = compras.index("café")
print(f"O café está na posição {posicao}.")
print(compras.index("açúcar"))
$ python3 procurar.py
O café está na posição 2.
Traceback (most recent call last):
File "/home/ana/procurar.py", line 4, in <module>
print(compras.index("açúcar"))
~~~~~~~~~~~~~^^^^^^^^^^
ValueError: list.index(x): x not in list
O café está no índice 2, e o programa mostrou isso. Na linha 4, a Ana pediu o índice do açúcar, que não está na lista, e o programa parou com um erro. Você vai ver esse erro com calma em Quando dá errado; o jeito seguro é perguntar antes com in:
compras = ["arroz", "feijão", "café", "leite"]
procurado = "açúcar"
if procurado in compras:
print(f"{procurado} está na posição {compras.index(procurado)}.")
else:
print(f"{procurado} não está na lista.")
$ python3 procurar2.py açúcar não está na lista.
Itens repetidos
Na cesta da padaria, o pão aparece três vezes. O count() ("contar") diz quantas vezes um item aparece, e o index() devolve só a primeira posição. Um segundo número no index() diz a partir de qual índice procurar:
>>> cesta = ["pão", "leite", "pão", "ovos", "pão"]
>>> cesta.count("pão")
3
>>> cesta.count("café")
0
>>> cesta.index("pão")
0
>>> cesta.index("pão", 1)
2
O count() nunca dá erro: se o item não está lá, a resposta é 0. O cesta.index("pão", 1) começou a procurar no índice 1 e achou o próximo pão no índice 2.
Missão: o programa diz uma posição escrita à mão, e errada. Troque o 0 por compras.index("café") para o Python descobrir a posição sozinho.
compras = ["arroz", "feijão", "café", "leite"]
posicao = 0
print(f"O café está na posição {posicao}.")
compras = ["arroz", "feijão", "café", "leite"]
posicao = compras.index("café")
print(f"O café está na posição {posicao}.")
5. O item de um item
O que você pega de uma lista é um valor comum, então dá para continuar "abrindo" esse valor. Um item que é texto tem letras; um item que é uma lista tem itens.
>>> compras[0][0] 'a' >>> compras[-1].upper() 'SABÃO'
compras[0] é 'arroz', e o [0] seguinte pega a primeira letra do arroz. compras[-1] é 'sabão', e o .upper() (aula Métodos de Texto) o põe em maiúsculas.
Listas dentro de listas
Uma lista pode guardar outras listas. A professora anotou cada aluno com a sua nota, num par [nome, nota]:
>>> turma = [["Ana", 9.5], ["Bruno", 7.0], ["Carla", 8.0]] >>> turma[1] ['Bruno', 7.0] >>> turma[1][0] 'Bruno' >>> turma[1][1] 7.0 >>> len(turma) 3
- turma[1]
- O item de índice 1 da turma: o par do Bruno, que é uma lista.
- turma[1][0]
- Leia da esquerda para a direita: "na turma, o item 1; nele, o item 0". O nome do Bruno.
- turma[1][1]
- No par do Bruno, o item 1: a nota.
- len(turma)
- 3: a turma tem 3 itens (os 3 pares). O
lennão conta o que está dentro de cada par.
Isso funciona, mas lembrar que "0 é o nome e 1 é a nota" cansa. Para fichas assim, as aulas Tuplas e Dicionários mostram jeitos mais claros.
Formas diferentes de pegar itens
| Você quer | Escreva | Observação |
|---|---|---|
| O primeiro item | lista[0] | Erro se a lista estiver vazia |
| O último item | lista[-1] | Melhor que lista[len(lista) - 1]: mais curto, mesmo resultado |
| O item da posição N, contando do 1 (como as pessoas contam) | lista[n - 1] | A chamada da escola, o "terceiro da fila" |
| Os N primeiros | lista[:n] | Uma lista nova; nunca dá erro |
| Os N últimos | lista[-n:] | Uma lista nova; nunca dá erro |
| O índice de um item | lista.index(item) | Erro se o item não estiver lá: pergunte antes com in |
| Quantas vezes um item aparece | lista.count(item) | Devolve 0 se não aparecer |
Quando dá errado
A Ana sabe que a lista tem 4 itens e, para pegar o último, escreveu compras[len(compras)], isto é, compras[4]:
compras = ["arroz", "feijão", "café", "leite"]
print(f"A lista tem {len(compras)} itens.")
print(compras[len(compras)])
$ python3 fora.py
A lista tem 4 itens.
Traceback (most recent call last):
File "/home/ana/fora.py", line 3, in <module>
print(compras[len(compras)])
~~~~~~~^^^^^^^^^^^^^^
IndexError: list index out of range
Linha por linha:
- A linha 2 rodou:
A lista tem 4 itens.O erro aconteceu depois. Traceback (most recent call last): "rastro do erro (a chamada mais recente por último)". É o começo de toda mensagem de erro de um programa que já estava rodando.File "/home/ana/fora.py", line 3, in <module>: no arquivofora.py, linha 3, no corpo principal do programa (<module>).- A linha de código e, embaixo, as marcas: os
~~~~~~~embaixo decomprase os^^^^embaixo do índice[len(compras)]. É o Python 3.14 mostrando qual parte da linha deu problema: o índice usado na lista. IndexError: list index out of range: "erro de índice: índice da lista fora do intervalo". Os índices que existem vão de 0 a 3; o 4 não existe.
O mesmo erro acontece com um índice negativo grande demais (compras[-6] numa lista de 5) e com lista[0] numa lista vazia:
>>> compras = ["arroz", "feijão", "café", "leite", "sabão"]
>>> compras[-6]
Traceback (most recent call last):
File "<python-input-1>", line 1, in <module>
compras[-6]
~~~~~~~^^^^
IndexError: list index out of range
Como consertar: lembre que o último índice é len(lista) - 1, ou use lista[-1]. Se o índice vem de fora (do teclado, de uma conta), confira antes com if 0 <= indice < len(lista):.
index() de um item que não está lá
Você viu a mensagem lá em cima, no procurar.py:
ValueError: list.index(x): x not in list
"Erro de valor: list.index(x): x não está na lista". O x é só o nome que a mensagem dá para "o item que você procurou" (no caso, o açúcar); ela não repete o valor. Repare na diferença: o IndexError é um índice que não existe; o ValueError é um valor que não está na lista. E lembre que a comparação é exata: compras.index("Café"), com C maiúsculo, dá o mesmo erro. Como consertar: pergunte antes com if item in lista: (como no procurar2.py).
Até o Python 3.13 (o que vem no Debian 13, por exemplo), a mesma linha dizia ValueError: 'açúcar' is not in list, com o item na mensagem. No 3.14 ela ficou como você viu acima. Se você encontrar a forma antiga num livro ou num computador com um Python mais velho, é o mesmo erro.
A professora quer digitar o número do aluno na chamada e ver o nome:
alunos = ["Ana", "Bruno", "Carla", "Davi", "Eva"]
numero = input("Número na chamada: ")
print(alunos[numero])
$ python3 chamada.py
Número na chamada: 4
Traceback (most recent call last):
File "/home/ana/chamada.py", line 3, in <module>
print(alunos[numero])
~~~~~~^^^^^^^^
TypeError: list indices must be integers or slices, not str
"Erro de tipo: os índices de uma lista precisam ser inteiros ou fatias, e não str". O input() sempre devolve um texto (aula input()): o que chegou foi "4", e não o número 4. Com um decimal acontece o mesmo, e a mensagem termina em not float:
>>> compras[1.0]
Traceback (most recent call last):
File "<python-input-2>", line 1, in <module>
compras[1.0]
~~~~~~~^^^^^
TypeError: list indices must be integers or slices, not float
Como consertar: converta com int() (aula Conversão de Tipos). E, como a chamada começa no 1 e os índices no 0, desconte 1:
alunos = ["Ana", "Bruno", "Carla", "Davi", "Eva"]
numero = int(input("Número na chamada: "))
posicao = numero - 1
print(f"O número {numero} é {alunos[posicao]}.")
$ python3 chamada2.py
Número na chamada: 4
O número 4 é Davi.
$ python3 chamada2.py
Número na chamada: 9
Traceback (most recent call last):
File "/home/ana/chamada2.py", line 4, in <module>
print(f"O número {numero} é {alunos[posicao]}.")
~~~~~~^^^^^^^^^
IndexError: list index out of range
Com o 4, saiu o Davi, o quarto da chamada. Com o 9, voltou o IndexError: a turma só tem 5 alunos. (E se alguém digitar quatro, por extenso, o erro é outro: ValueError: invalid literal for int() with base 10: 'quatro', do int(). Tratar esses erros sem o programa parar é assunto da aula try e except.)
compras = ["arroz", "feijão", "café", "leite"] print(compras(0))
$ python3 parenteses.py
Traceback (most recent call last):
File "/home/ana/parenteses.py", line 2, in <module>
print(compras(0))
~~~~~~~^^^
TypeError: 'list' object is not callable
Parênteses depois de um nome querem dizer "chame (execute) isto", como em print(…) e len(…). Uma lista não é uma função, então "o objeto lista não pode ser chamado". Como consertar: para pegar um item, colchetes: compras[0].
Referência rápida
| Escrita | O que devolve | Com ["arroz", "feijão", "café", "leite"] |
|---|---|---|
lista[i] | O item de índice i (o primeiro é o 0) | lista[1] → 'feijão' |
lista[-i] | O i-ésimo item contando do fim | lista[-1] → 'leite' |
lista[a:b] | Uma lista nova, do índice a até antes do b | lista[1:3] → ['feijão', 'café'] |
lista[:n] / lista[-n:] | Os n primeiros / os n últimos | lista[:2] → ['arroz', 'feijão'] |
lista[::passo] | De passo em passo; -1 inverte | lista[::-1] → ['leite', 'café', 'feijão', 'arroz'] |
lista.index(x) | O índice da primeira ocorrência de x | lista.index("café") → 2 |
lista.index(x, i) | …procurando a partir do índice i | |
lista.count(x) | Quantas vezes x aparece | lista.count("pão") → 0 |
lista[i][j] | O item j de dentro do item i | lista[0][0] → 'a' |
| Sintoma | Causa provável |
|---|---|
IndexError: list index out of range | Índice maior que o último (len - 1), negativo demais, ou lista vazia |
ValueError: list.index(x): x not in list | index() de um item que não está na lista (confira maiúsculas e acentos) |
TypeError: list indices must be integers or slices, not str | O índice é um texto, quase sempre vindo do input(): use int() |
TypeError: 'list' object is not callable | Parênteses no lugar dos colchetes: lista(0) |
| Veio o item "do lado" | Contou a partir do 1: o índice é a posição menos 1 |
Exercícios
1. O primeiro aluno
Com alunos = ["Ana", "Bruno", "Carla"], complete para mostrar a Ana:
2. O último, sem saber o tamanho
Complete com o índice que sempre pega o último item, qualquer que seja o tamanho da lista:
3. Os três primeiros
Complete a fatia que pega os 3 primeiros itens:
4. A lista compras tem 6 itens. Qual destes dá IndexError?
5. O que mostra print(["pão", "leite", "pão"].index("pão"))?
6. Qual a diferença entre compras[0] e compras[0:1]?
Missão final: a chamada da turma
Missão: a professora digita o número do aluno na chamada (que começa no 1) e o programa mostra o nome e a nota. Do jeito que está, dá TypeError. Converta o que foi digitado com int() e desconte 1 para achar o índice. (O editor vai digitar o 4 por você.)
alunos = ["Ana", "Bruno", "Carla", "Davi", "Eva"]
notas = [9.5, 7.0, 8.0, 6.5, 10.0]
numero = input("Número na chamada: ")
posicao = numero
print(f"{alunos[posicao]} tirou {notas[posicao]}")
alunos = ["Ana", "Bruno", "Carla", "Davi", "Eva"]
notas = [9.5, 7.0, 8.0, 6.5, 10.0]
numero = int(input("Número na chamada: "))
posicao = numero - 1
print(f"{alunos[posicao]} tirou {notas[posicao]}")
Repare que as duas listas usam o mesmo índice: o aluno do índice 3 tem a nota do índice 3. É um jeito simples de guardar dados que andam juntos; a aula enumerate() e zip() mostra como percorrer as duas de uma vez.
Resumo
- Cada item tem um índice, e o primeiro é o 0. O último é
len(lista) - 1. lista[i]pega um item; o resultado é um valor comum, que dá para guardar e usar.- Índices negativos contam do fim:
lista[-1]é o último,lista[-2]o penúltimo. lista[a:b]é uma fatia: uma lista nova do índiceaaté antes dob. Fatias nunca dão erro.lista.index(x)diz onde está o item (a primeira vez);lista.count(x)diz quantas vezes ele aparece.- Índice que não existe:
IndexError. Item que não existe noindex():ValueError(pergunte antes comin). - O índice tem de ser inteiro: o que vem do
input()precisa deint(). - Em listas dentro de listas, leia da esquerda para a direita:
turma[1][0].