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.

Você vai aprender
  • 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 com count().
  • A chegar num item de uma lista que está dentro de outra lista.
  • Os erros reais: IndexError, o ValueError do index() e o índice que veio do input() 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"
Índice0123
Í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.

"Posição" e "índice"

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']
FatiaLê-seResultado
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 todaUma 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 len nã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ê querEscrevaObservação
O primeiro itemlista[0]Erro se a lista estiver vazia
O último itemlista[-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 primeiroslista[:n]Uma lista nova; nunca dá erro
Os N últimoslista[-n:]Uma lista nova; nunca dá erro
O índice de um itemlista.index(item)Erro se o item não estiver lá: pergunte antes com in
Quantas vezes um item aparecelista.count(item)Devolve 0 se não aparecer

Quando dá errado

IndexError: pedir um armário que não existe

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 arquivo fora.py, linha 3, no corpo principal do programa (<module>).
  • A linha de código e, embaixo, as marcas: os ~~~~~~~ embaixo de compras e 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):.

ValueError: o 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).

A mensagem mudou de uma versão para outra

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.

TypeError: o índice que veio do teclado

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.)

Parênteses no lugar dos colchetes
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

EscritaO que devolveCom ["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 fimlista[-1] → 'leite'
lista[a:b]Uma lista nova, do índice a até antes do blista[1:3] → ['feijão', 'café']
lista[:n] / lista[-n:]Os n primeiros / os n últimoslista[:2] → ['arroz', 'feijão']
lista[::passo]De passo em passo; -1 invertelista[::-1] → ['leite', 'café', 'feijão', 'arroz']
lista.index(x)O índice da primeira ocorrência de xlista.index("café") → 2
lista.index(x, i)…procurando a partir do índice i
lista.count(x)Quantas vezes x aparecelista.count("pão") → 0
lista[i][j]O item j de dentro do item ilista[0][0] → 'a'
SintomaCausa 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 listindex() de um item que não está na lista (confira maiúsculas e acentos)
TypeError: list indices must be integers or slices, not strO índice é um texto, quase sempre vindo do input(): use int()
TypeError: 'list' object is not callableParê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:

print(alunos[])

2. O último, sem saber o tamanho

Complete com o índice que sempre pega o último item, qualquer que seja o tamanho da lista:

ultimo = notas[]

3. Os três primeiros

Complete a fatia que pega os 3 primeiros itens:

podio = classificacao[]

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 índice a até antes do b. 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 no index(): ValueError (pergunte antes com in).
  • O índice tem de ser inteiro: o que vem do input() precisa de int().
  • Em listas dentro de listas, leia da esquerda para a direita: turma[1][0].