✅ Artigo atualizado em Setembro 2026 Nova tabela completa de métodos (retorno e se altera a lista), seções sobre os comandos append, insert, remove e pop, ordenação e lista de dicionários, erros comuns com traceback e 8 exercícios resolvidos.
Resposta rápida
Uma lista em Python é uma coleção ordenada e mutável de itens, criada com colchetes: frutas = ['maçã', 'banana']. Serve para guardar vários valores em uma única variável, acessar cada um pelo índice (frutas[0], começando em 0) e adicionar ou remover itens com métodos como append() e pop().
1
2
3
4
5
frutas = ['maçã', 'banana', 'uva']
frutas.append('manga') # adiciona no final
print(frutas[0]) # maçã
print(frutas[-1]) # manga
print(len(frutas)) # 4
Resumo em 30 segundos:
- Os índices começam em
0, elista[-1]é o último item. -
append(x)adiciona no final,insert(i, x)insere na posiçãoi,remove(x)apaga pelo valor epop(i)apaga pelo índice e devolve o item. -
lista.sort()altera a própria lista e retornaNone;sorted(lista)devolve uma nova lista. -
b = anão copia a lista (os dois nomes apontam para o mesmo objeto): usea.copy(). - Acessar um índice que não existe gera
IndexError: list index out of range.
Salve salve Pythonista!
Listas são a estrutura de dados mais versátil do Python! Mutáveis, dinâmicas e heterogêneas, são perfeitas para armazenar coleções de dados que precisam ser modificadas.
Neste guia completo, você vai aprender:
- ✅ Criação e operações básicas
- ✅ Métodos essenciais (append, extend, insert, remove, pop, sort) e o que cada um retorna
- ✅ Casos de uso reais (filas, pilhas, processamento)
- ✅ Lista vs Tupla vs Array - quando usar cada uma
- ✅ Erros comuns e exercícios resolvidos (inclusive no formato de questão de prova)
Se prepare que o post está C-O-M-P-L-E-T-O! Então já abre seu terminal e vamos nessa!

Ops, Fallout ![]()
O que é uma lista em Python? Uma lista (list) em Python é uma coleção ordenada e mutável de valores, escrita entre colchetes e separada por vírgulas - por exemplo ['Python', 'Academy', 2021]. Ela aceita itens de tipos diferentes, permite acesso por índice (começando em 0), pode crescer ou encolher em tempo de execução e é a estrutura de dados mais usada da linguagem. A referência oficial é o capítulo de estruturas de dados do tutorial do Python.
Este é o guia-pilar de Listas da Python Academy. A partir daqui você se aprofunda nos posts dedicados de manipulação de listas (métodos), fatiamento (slicing) de listas e list comprehensions.
Vá Direto ao Assunto…
- Introdução
- Criando listas
- Acessando dados da lista
- Percorrendo listas
- Cópia vs. referência (alias)
- Métodos para manipulação de Listas
- Comandos de lista em Python: append, insert, remove e pop
- Como ordenar uma lista em Python
- Casos de Uso Reais
- Lista de dicionários em Python
- Lista vs Tupla vs Array
- Erros comuns
- Exercícios resolvidos
Introdução
Uma Lista (list) em Python, nada mais é que uma coleção ordenada de valores, separados por vírgula e dentro de colchetes [].
Elas são utilizadas para armazenar diversos itens em uma única variável. Entender este conteúdo é de extrema importância para dominar a linguagem por completo!
Abaixo temos um exemplo de uma lista:
1
2
3
4
# Exemplo de lista:
lista = ['Python', 'Academy']
print(lista)
Saída do código acima:
1
['Python', 'Academy']
Podemos observar a classe de uma lista com type():
1
2
3
lista = []
print(type(lista))
Saída do código acima:
1
<class 'list'>
Criando listas
Existem várias maneiras de se criar uma lista.
A maneira mais simples é envolver os elementos da lista por colchetes, por exemplo:
1
2
# Lista com apenas um elemento
lista = ["PythonAcademy"]
Também podemos criar uma lista vazia:
1
lista = []
Para criar uma lista com diversos itens, podemos fazer:
1
lista = ['Python', 'Academy', 2021]
Para uma lista com um único elemento, basta usar os colchetes diretamente:
1
lista = ["Python Academy"]
A função list do próprio Python (built-in function) serve para converter outro iterável em lista - por exemplo, uma tupla ou uma string:
1
lista = list(('Python', 'Academy'))
Outra forma é criar listas resultantes de uma operação de List Comprehensions!
Não domina List Comprehensions? Então leia nosso guia completo de List Comprehensions no Python!
1
[item for item in iteravel]
Podemos ainda criar listas através da função range(), dessa forma:
1
list(range(10))
O que resultará em:
1
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Repare que o 10 não entra: o valor final do range() é sempre exclusivo. Os detalhes (início, fim e passo) estão no post sobre a função range() do Python.
Mais dois atalhos úteis para criar listas: repetir um valor com * e quebrar uma string em palavras com split():
1
2
3
4
5
zeros = [0] * 5
print(zeros) # [0, 0, 0, 0, 0]
palavras = 'python academy blog'.split()
print(palavras) # ['python', 'academy', 'blog']
Acessando dados da lista
Todos os itens de uma lista são indexados, ou seja para cada item da lista um índice é atribuído da seguinte forma: lista[indice].
Exemplo com itens:
1
frutas = ['Maça', 'Banana', 'Jaca', 'Melão', 'Abacaxi']
E assim ficaria a sequência de índices:

Em Python os índices são iniciados em 0.
Ou seja, como podemos acessar o primeiro item da lista que é o índice 0? Veja abaixo:
1
print(frutas[0])
A saída como previsível foi a string com a palavra Maça por ocupar o índice 0:
1
Maça
Como o primeiro índice é 0, o último índice válido é sempre len(lista) - 1. Nesta lista de 5 frutas, os índices vão de 0 a 4, e frutas[5] gera IndexError (veja em Erros comuns).
Agora vamos ver sobre Indexação Negativa!
Está curtindo esse conteúdo? ![]()
Que tal receber 30 dias de conteúdo direto na sua Caixa de Entrada?
Agora que se inscreveu, podemos seguir! ![]()
Indexação negativa
E se o desejado for o último item?
Neste momento entramos no conceito de indexação negativa, que significa começar do fim.
-1 irá se referir ao último item. Por exemplo:

Dessa forma, para buscar pelo último item da lista:
1
print(frutas[-1])
Resultando em:
1
Abacaxi
Lista dentro de lista
Suponha que exista uma lista dentro de uma lista, assim:
1
lista = ['item1', ['python', 'Academy'], 'item3']
Como podemos acessar o primeiro índice do item que é uma lista?
A resposta é simples, basta selecionar a posição em que se localiza a lista para ter acesso a ela, assim:
1
2
sublista = lista[1]
print(sublista[0])
Ou ainda:
1
print(lista[1][0])
Ambos obtém mesmo resultado:
1
python
Repare que o print() exibe o valor da string sem aspas: as aspas só aparecem quando a string está dentro de uma estrutura, como ao imprimir a lista inteira.
Estou construindo o Ebookr.ai, uma plataforma onde você cria ebooks profissionais com IA sobre qualquer assunto - do zero ao PDF pronto, com capas e infográficos gerados automaticamente. Dá uma olhada!
Fatiando uma lista (slicing)
O fatiamento de listas, do inglês slicing, é a extração de um conjunto de elementos contidos numa lista. Ele é feito da seguinte forma:
1
lista[ inicio : fim : passo ]
Explicando cada elemento:
-
iníciose refere ao índice de início do fatiamento. -
fimse refere ao índice final do fatiamento. A lista final não vai conter esse elemento. -
passoé um parâmetro opcional e é utilizado para se pular elementos da lista original
Vamos entender melhor em seguida!
Se quisermos criar uma fatia de uma lista do índice 2 ao 4, podemos fazer da seguinte forma:
1
2
3
lista = [10, 20, 30, 40, 50, 60]
print(lista[2:5])
O slicing conta a partir do índice 2 até o índice 5 (mas não o utiliza), pegando os índices 2, 3, 4.
Sua saída será:
1
[30, 40, 50]
O slicing tem ainda mais truques (passo negativo, inverter listas, copiar com
lista[:]). Veja todos no nosso guia completo de fatiamento (slicing) de listas no Python.
Percorrendo listas
A forma mais comum de percorrer os elementos em uma lista é com um loop for elemento in lista, assim:
1
2
3
4
lista = [10, 20, 30, 40, 50, 60]
for num in lista:
print(num)
Saída:
1
2
3
4
5
6
10
20
30
40
50
60
Com a função enumerate() podemos percorrer também o índice referente a cada valor da lista:
1
2
3
4
lista = [10, 20, 30, 40, 50, 60]
for indice, valor in enumerate(lista):
print(f'índice={indice}, valor={valor}')
Sua saída será:
1
2
3
4
5
6
índice=0, valor=10
índice=1, valor=20
índice=2, valor=30
índice=3, valor=40
índice=4, valor=50
índice=5, valor=60
Também dá para percorrer a lista com while, controlando o índice na mão. É o formato que mais aparece em exercícios de faculdade, com a condição i < len(lista):
1
2
3
4
5
6
lista = [10, 20, 30]
i = 0
while i < len(lista):
print(i, lista[i])
i += 1
Saída:
1
2
3
0 10
1 20
2 30
Por que i < len(lista) e não i <= len(lista)? Porque os índices vão de 0 a len(lista) - 1: com <=, a última volta tentaria ler lista[3] e quebraria com IndexError. Na prática, prefira o for (com enumerate() quando precisar do índice); o while e o for i in range(len(lista)) são mais verbosos. Veja todas as formas de laço no post sobre estruturas de repetição (for e while) no Python.
Cuidado com um antipadrão comum: você até veria a mesma saída escrevendo
[print(num) for num in lista], mas não faça isso. Uma list comprehension existe para construir uma lista; ao usá-la só pelo efeito colateral doNone:
1
2
3
4
lista = [10, 20]
resultado = [print(num) for num in lista]
print(resultado)
Saída:
1
2
3
10
20
[None, None]
Para apenas percorrer e imprimir, prefira sempre o for normal - é mais legível e não desperdiça memória. Reserve as list comprehensions para quando o objetivo for de fato gerar uma nova lista.
Cópia vs. referência (alias)
Atribuir uma lista a outra variável não a copia. lista2 = lista1 cria um alias: os dois nomes apontam para o mesmo objeto na memória. Por isso, mutar um afeta o outro:
1
2
3
4
5
6
7
8
lista1 = [1, 2, 3]
lista2 = lista1 # alias: mesmo objeto, NÃO é cópia
lista2.append(4)
print('lista1:', lista1)
print('lista2:', lista2)
print('mesmo objeto?', lista1 is lista2)
Saída:
1
2
3
lista1: [1, 2, 3, 4]
lista2: [1, 2, 3, 4]
mesmo objeto? True
Repare: alteramos lista2, mas lista1 mudou junto. O operador is confirma que é o mesmo objeto.
Para obter uma cópia independente (uma cópia rasa, ou shallow copy), use .copy(), list(lista) ou o slicing lista[:]:
1
2
3
4
5
6
7
8
lista1 = [1, 2, 3]
copia = lista1.copy() # ou list(lista1), ou lista1[:]
copia.append(4)
print('lista1:', lista1)
print('copia:', copia)
print('mesmo objeto?', lista1 is copia)
Saída:
1
2
3
lista1: [1, 2, 3]
copia: [1, 2, 3, 4]
mesmo objeto? False
Cuidado com listas aninhadas. Uma cópia rasa copia só o nível externo: as sublistas continuam compartilhadas entre original e cópia. Para uma cópia totalmente independente, use
copy.deepcopy():
1
2
3
4
5
6
7
8
9
10
11
12
import copy
original = [[1, 2], [3, 4]]
rasa = original.copy() # cópia rasa: sublistas compartilhadas
rasa[0].append(99)
print('apos copy() rasa:', original)
original = [[1, 2], [3, 4]]
profunda = copy.deepcopy(original) # cópia profunda: tudo independente
profunda[0].append(99)
print('apos deepcopy():', original)
Saída:
1
2
apos copy() rasa: [[1, 2, 99], [3, 4]]
apos deepcopy(): [[1, 2], [3, 4]]
Ou seja: na cópia rasa, mexer na sublista vazou para o original; com deepcopy(), o original ficou intacto. ![]()
Métodos para manipulação de Listas
As listas têm métodos próprios para adicionar, remover, buscar e reordenar elementos. A tabela abaixo reúne os 11 métodos de lista, o que cada um retorna e se ele altera a lista original (os exemplos partem sempre de l = ['a', 'b', 'c']):
| Método | O que faz | Retorna | Altera a lista? | Exemplo |
|---|---|---|---|---|
l.append(x) |
Adiciona x no final
|
None |
Sim |
l.append('d') deixa ['a', 'b', 'c', 'd']
|
l.extend(iteravel) |
Adiciona cada item de outro iterável no final | None |
Sim |
l.extend(['e', 'f']) deixa ['a', 'b', 'c', 'e', 'f']
|
l.insert(i, x) |
Insere x na posição i
|
None |
Sim |
l.insert(1, 'X') deixa ['a', 'X', 'b', 'c']
|
l.remove(x) |
Remove a primeira ocorrência do valor x (ValueError se não existir) |
None |
Sim |
l.remove('b') deixa ['a', 'c']
|
l.pop(i) |
Remove o item do índice i (sem i, o último) |
O item removido | Sim |
l.pop() devolve 'c' e deixa ['a', 'b']
|
l.index(x) |
Procura a posição da primeira ocorrência de x (ValueError se não existir) |
int |
Não |
l.index('b') devolve 1
|
l.count(x) |
Conta quantas vezes x aparece |
int |
Não |
l.count('a') devolve 1
|
l.sort() |
Ordena a lista (aceita key e reverse) |
None |
Sim |
[3, 1, 2] vira [1, 2, 3]
|
l.reverse() |
Inverte a ordem | None |
Sim |
l.reverse() deixa ['c', 'b', 'a']
|
l.copy() |
Cria uma cópia rasa | Uma nova lista | Não |
l.copy() devolve ['a', 'b', 'c'] (outro objeto) |
l.clear() |
Remove todos os itens | None |
Sim |
l.clear() deixa []
|
Repare na coluna “Retorna”: quase todo método que altera a lista devolve None. A exceção é o pop(), que devolve o item removido:
1
2
3
4
5
6
7
l = ['a', 'b', 'c']
print(l.append('d')) # None: o append altera a lista, não devolve nada
print(l) # ['a', 'b', 'c', 'd']
print(l.pop()) # d
print(l.index('b')) # 1
print(l.count('a')) # 1
A lista oficial de métodos, com a assinatura de cada um, está na documentação do Python sobre listas.
Cada um desses métodos tem detalhes importantes (complexidade, cópia vs. ordenação in-place, key/reverse no sort). Aprofundamos todos eles no nosso guia dedicado de manipulação de listas no Python.
Comandos de lista em Python: append, insert, remove e pop
Esses quatro comandos são os que mais caem em prova (em especial nas questões de “associe a coluna A à coluna B”) e os que você mais vai usar no dia a dia:
-
append(x): adicionaxao final da lista. -
insert(i, x): inserexna posiçãoi, empurrando os itens seguintes para a direita. -
remove(x): remove a primeira ocorrência do valorx. -
pop(i): remove o item do índiceie devolve esse item; sem argumento, remove e devolve o último.
Veja os quatro em ação, na ordem:
1
2
3
4
5
6
7
8
9
tarefas = ['estudar', 'codar']
tarefas.append('testar') # ['estudar', 'codar', 'testar']
tarefas.insert(0, 'planejar') # ['planejar', 'estudar', 'codar', 'testar']
tarefas.remove('codar') # ['planejar', 'estudar', 'testar']
ultima = tarefas.pop() # remove e devolve 'testar'
print(tarefas)
print(ultima)
Saída:
1
2
['planejar', 'estudar']
testar
A confusão mais comum é entre remove e pop: remove recebe o valor e não devolve nada; pop recebe o índice e devolve o item removido.
Como remover um item de uma lista
Existem quatro formas de remover itens, e a escolha depende do que você tem em mãos (o valor ou a posição) e se vai usar o item removido:
| Quero… | Use | Exemplo |
|---|---|---|
| Remover pelo valor | lista.remove(x) |
cores.remove('azul') |
| Remover pelo índice e usar o item | lista.pop(i) |
primeiro = fila.pop(0) |
| Remover pelo índice (ou uma fatia) sem usar o item | del lista[i] |
del lista[1:3] |
| Esvaziar a lista inteira | lista.clear() |
carrinho.clear() |
| Remover todas as ocorrências de um valor | list comprehension | [x for x in lista if x != 'b'] |
O remove() só apaga a primeira ocorrência. Para tirar todas, gere uma nova lista filtrando o valor:
1
2
3
lista = ['a', 'b', 'c', 'b']
sem_b = [x for x in lista if x != 'b']
print(sem_b) # ['a', 'c']
Como ordenar uma lista em Python
Há duas formas de ordenar: o método lista.sort(), que altera a própria lista, e a função sorted(lista), que devolve uma nova lista e deixa a original intacta. As duas aceitam reverse=True (ordem decrescente) e key (critério de ordenação):
1
2
3
4
5
6
7
8
9
10
11
12
numeros = [5, 2, 9, 1]
ordenada = sorted(numeros) # nova lista
print(ordenada) # [1, 2, 5, 9]
print(numeros) # [5, 2, 9, 1] (não mudou)
numeros.sort(reverse=True) # altera numeros e retorna None
print(numeros) # [9, 5, 2, 1]
nomes = ['Bernardo', 'Ana', 'Caio']
nomes.sort(key=len) # ordena pelo tamanho do nome
print(nomes) # ['Ana', 'Caio', 'Bernardo']
lista.sort() |
sorted(lista) |
|
|---|---|---|
| Altera a lista original? | Sim | Não |
| O que retorna | None |
Uma nova lista ordenada |
| Funciona com | Só listas | Qualquer iterável (tupla, string, dicionário…) |
| Quando usar | Não precisa mais da ordem original | Precisa manter a original ou ordenar algo que não é lista |
Dois cuidados: nunca escreva lista = lista.sort() (a variável vira None, veja em Erros comuns) e não misture tipos que não se comparam, como números e strings - [3, 'a', 1].sort() gera TypeError: '<' not supported between instances of 'str' and 'int'.
Antes de ver esses casos de uso, vale reforçar: entender listas de verdade é dominar boa parte da base de Python - e essa base, construída com projetos guiados, é o que ensinamos na Jornada Python:
Casos de Uso Reais
1. Implementar Fila (FIFO)
1
2
3
4
5
6
7
8
9
10
11
12
# Fila: First In, First Out
fila_atendimento = []
# Adicionar pessoas na fila
fila_atendimento.append('Alice')
fila_atendimento.append('Bob')
fila_atendimento.append('Charlie')
# Atender (remover do início)
atendido = fila_atendimento.pop(0) # 'Alice'
print(f"Atendendo: {atendido}")
print(f"Fila atual: {fila_atendimento}") # ['Bob', 'Charlie']
2. Implementar Pilha (LIFO)
1
2
3
4
5
6
7
8
9
10
11
12
# Pilha: Last In, First Out
pilha_pratos = []
# Empilhar pratos
pilha_pratos.append('Prato 1')
pilha_pratos.append('Prato 2')
pilha_pratos.append('Prato 3')
# Desempilhar (remover do final)
prato = pilha_pratos.pop() # 'Prato 3'
print(f"Prato retirado: {prato}")
print(f"Pilha: {pilha_pratos}") # ['Prato 1', 'Prato 2']
3. Processar Dados em Lote
1
2
3
4
5
6
7
8
# Processar IDs de usuários em lotes de 100
user_ids = list(range(1, 1001)) # 1000 usuários
batch_size = 100
for i in range(0, len(user_ids), batch_size):
batch = user_ids[i:i + batch_size]
print(f"Processando lote {i//batch_size + 1}: {len(batch)} usuários")
# process_users(batch) # Função de processamento
4. Manter Histórico (limitado)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Histórico de comandos (máximo 5)
history = []
MAX_HISTORY = 5
def add_command(cmd):
history.append(cmd)
if len(history) > MAX_HISTORY:
history.pop(0) # Remove o mais antigo
add_command('ls')
add_command('cd /home')
add_command('pwd')
add_command('mkdir test')
add_command('rm test')
add_command('cat file.txt') # Remove 'ls'
print(history) # ['cd /home', 'pwd', 'mkdir test', 'rm test', 'cat file.txt']
Lista de dicionários em Python
Uma lista de dicionários é o formato mais comum para guardar vários registros com os mesmos campos - alunos, produtos, pedidos, linhas de um JSON. Cada item da lista é um dicionário, e você combina o índice da lista com a chave do dicionário:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
alunos = [
{'nome': 'Ana', 'nota': 8.5},
{'nome': 'Bruno', 'nota': 6.0},
{'nome': 'Carla', 'nota': 9.2},
]
for aluno in alunos:
print(f"{aluno['nome']}: {aluno['nota']}")
aprovados = [a['nome'] for a in alunos if a['nota'] >= 7]
print(aprovados)
melhor = max(alunos, key=lambda a: a['nota'])
print(melhor['nome'])
Saída:
1
2
3
4
5
Ana: 8.5
Bruno: 6.0
Carla: 9.2
['Ana', 'Carla']
Carla
Para acessar um campo direto, use os dois índices em sequência: alunos[0]['nome'] devolve 'Ana'. Se os dicionários ainda são novidade, leia o guia de dicionários no Python; o key=lambda ... é explicado no post sobre funções lambda.
Lista vs Tupla vs Array
Comparação Rápida
| Característica | Lista | Tupla | Array (numpy) |
|---|---|---|---|
| Mutável | ✅ Sim | ❌ Não | ✅ Sim |
| Heterogênea | ✅ Sim | ✅ Sim | ❌ Não (tipo único) |
| Performance | ⚠️ Média | ✅ Rápida | ✅ Muito rápida |
| Memória | ⚠️ Média | ✅ Menor | ✅ Muito menor |
| Casos de uso | Geral | Dados imutáveis | Cálculos numéricos |
Quando Usar Cada Uma?
✅ Use Lista quando:
- Precisa modificar dados (adicionar/remover)
- Coleção dinâmica (tamanho varia)
- Tipos mistos (strings, ints, objetos)
- Operações gerais de programação
1
2
3
# Lista: flexível e mutável
tasks = ['estudar', 'codar', 'testar']
tasks.append('deploy') # ✅ Pode modificar
✅ Use Tupla quando:
- Dados imutáveis (não mudam)
- Chaves de dicionário (precisam ser hasheáveis)
- Retornar múltiplos valores de função
- Coordenadas, configs, constantes
1
2
3
# Tupla: imutável e mais rápida
position = (10, 20) # Coordenada (x, y)
# position[0] = 15 # ❌ Erro! Imutável
✅ Use Array (numpy) quando:
- Cálculos numéricos intensivos
- Todos elementos mesmo tipo
- Operações matemáticas (vetorização)
- Data Science, Machine Learning
1
2
3
4
5
import numpy as np
# Array: otimizado para números
temperatures = np.array([25.5, 26.0, 24.8, 27.2])
mean_temp = temperatures.mean() # Operações rápidas
Erros comuns
Estes são os erros que mais aparecem com listas, com a mensagem real que o Python mostra (ou o resultado errado, quando o bug é silencioso).
Acessar um índice que não existe (IndexError)
1
2
frutas = ['maçã', 'banana', 'uva']
print(frutas[3])
1
IndexError: list index out of range
A lista tem 3 itens, então os índices vão de 0 a 2. Correção: use frutas[2] ou, para o último item sem se preocupar com o tamanho, frutas[-1].
Atribuir o resultado do sort() (lista = lista.sort())
1
2
3
4
numeros = [3, 1, 2]
numeros = numeros.sort()
print(numeros)
print(numeros[0])
O primeiro print() mostra None, e o segundo quebra com:
1
TypeError: 'NoneType' object is not subscriptable
O sort() ordena a lista no lugar e retorna None, e a atribuição joga a lista fora. Correção: chame só numeros.sort(), sem atribuir, ou use numeros = sorted(numeros). O mesmo vale para append(), reverse() e os demais métodos que retornam None.
Achar que b = a copia a lista (bug silencioso)
1
2
3
4
original = [1, 2, 3]
backup = original
original.append(4)
print(backup)
1
[1, 2, 3, 4]
Não há erro, mas o “backup” mudou junto, porque os dois nomes apontam para a mesma lista. Correção: backup = original.copy() (ou copy.deepcopy() se houver listas aninhadas), como explicado na seção de cópia vs. referência acima.
Remover itens da lista durante o for (bug silencioso)
1
2
3
4
5
numeros = [1, 2, 2, 3, 4]
for n in numeros:
if n % 2 == 0:
numeros.remove(n)
print(numeros)
1
[1, 2, 3]
A ideia era remover todos os pares, mas um 2 sobrou. Ao remover um item, os seguintes andam uma posição para trás e o for pula o próximo. Correção: crie uma nova lista com numeros = [n for n in numeros if n % 2 != 0] (resultado [1, 3]) ou percorra uma cópia com for n in numeros[:]:.
Remover um valor que não está na lista (ValueError)
1
2
cores = ['azul', 'verde']
cores.remove('vermelho')
1
ValueError: list.remove(x): x not in list
Correção: confira antes com in - if 'vermelho' in cores: cores.remove('vermelho'). O index() tem o mesmo comportamento e gera ValueError: 'vermelho' is not in list.
Exercícios resolvidos
Tente resolver cada exercício antes de abrir a solução. Todos os códigos foram executados e as saídas conferidas.
Exercício 1. Crie a lista ['segunda', 'terça', 'quarta', 'quinta', 'sexta'] e imprima o primeiro dia, o último dia e a quantidade de dias.
Ver solução
1
2
3
4
dias = ['segunda', 'terça', 'quarta', 'quinta', 'sexta']
print(dias[0])
print(dias[-1])
print(len(dias))
Saída: segunda, sexta e 5 (um por linha)
O primeiro item está no índice 0 e o último pode ser acessado com -1, sem precisar saber o tamanho. A função len() devolve a quantidade de itens.
Exercício 2 (questão de prova). Pensando na manipulação de listas, observe os comandos da coluna A e associe-os às funções da coluna B.
| Coluna A | Coluna B |
|---|---|
1. append()
|
( ) Remove e retorna o elemento de uma posição (por padrão, o último). |
2. remove()
|
( ) Adiciona um elemento ao final da lista. |
3. insert()
|
( ) Remove a primeira ocorrência de um valor da lista. |
4. pop()
|
( ) Insere um elemento em uma posição específica da lista. |
Assinale a alternativa que apresenta a sequência correta da coluna B, de cima para baixo:
a) 4, 1, 2, 3
b) 1, 4, 3, 2
c) 4, 2, 1, 3
d) 2, 1, 4, 3
Ver solução
Resposta: a) 4, 1, 2, 3. Conferindo no código:
1
2
3
4
5
6
lista = ['a', 'b', 'c']
lista.append('d') # 1: adiciona no final
lista.insert(1, 'X') # 3: insere na posição 1
lista.remove('b') # 2: remove o valor 'b'
item = lista.pop() # 4: remove e retorna o último
print(lista, item)
Saída: ['a', 'X', 'c'] d
pop() é o único dos quatro que retorna o item removido (1ª linha da coluna B); append() adiciona no final; remove() apaga pelo valor; e insert() recebe a posição e o valor.
Exercício 3 (questão de prova). Qual é a saída do código abaixo?
1
2
numeros = [10, 20, 30, 40, 50]
print(numeros[1:4])
a) [10, 20, 30, 40]
b) [20, 30, 40]
c) [20, 30, 40, 50]
d) [10, 20, 30]
Ver solução
Saída: [20, 30, 40]
Resposta: b. O fatiamento começa no índice 1 (o 20) e para antes do índice 4, pegando os índices 1, 2 e 3. Mais exemplos no guia de fatiamento (slicing) de listas.
Exercício 4. Dada a lista de notas [7.5, 8.0, 6.5, 9.0], calcule a média e conte quantas notas ficaram acima dela.
Ver solução
1
2
3
4
5
6
7
8
9
10
notas = [7.5, 8.0, 6.5, 9.0]
media = sum(notas) / len(notas)
acima = 0
for nota in notas:
if nota > media:
acima += 1
print(f'Média: {media:.2f}')
print(f'Acima da média: {acima}')
Saída: Média: 7.75 e Acima da média: 2 (uma por linha)
sum() soma os itens e len() conta quantos são. Depois, o for percorre a lista comparando cada nota com a média (só 8.0 e 9.0 passam).
Exercício 5. Usando for, range() e append(), monte uma lista com os números pares de 1 a 10.
Ver solução
1
2
3
4
5
6
pares = []
for n in range(1, 11):
if n % 2 == 0:
pares.append(n)
print(pares)
Saída: [2, 4, 6, 8, 10]
Começar com uma lista vazia e ir fazendo append() é o padrão clássico. A mesma lista sai em uma linha com a list comprehension [n for n in range(1, 11) if n % 2 == 0].
Exercício 6 (questão de prova). O que o código abaixo imprime?
1
2
3
4
a = [1, 2, 3]
b = a
b.append(4)
print(a)
a) [1, 2, 3]
b) [1, 2, 3, 4]
c) [4]
d) Gera um erro
Ver solução
Saída: [1, 2, 3, 4]
Resposta: b. b = a não cria uma cópia: a e b são dois nomes para a mesma lista, então o append() feito por b aparece em a. Para ter listas independentes, use b = a.copy().
Exercício 7. Remova os itens repetidos de ['python', 'java', 'python', 'go', 'java'], mantendo a ordem da primeira aparição.
Ver solução
1
2
3
4
5
6
7
linguagens = ['python', 'java', 'python', 'go', 'java']
unicas = []
for item in linguagens:
if item not in unicas:
unicas.append(item)
print(unicas)
Saída: ['python', 'java', 'go']
O operador in verifica se o item já foi guardado. Um atalho que também preserva a ordem é list(dict.fromkeys(linguagens)); já list(set(linguagens)) remove as repetições, mas não garante a ordem (veja o post sobre sets no Python).
Exercício 8. Sem usar max(), encontre o maior valor de [12, 45, 7, 45, 30] e a posição da primeira vez em que ele aparece.
Ver solução
1
2
3
4
5
6
7
8
9
10
valores = [12, 45, 7, 45, 30]
maior = valores[0]
posicao = 0
for i, v in enumerate(valores):
if v > maior:
maior = v
posicao = i
print(f'Maior: {maior} na posição {posicao}')
Saída: Maior: 45 na posição 1
O enumerate() entrega índice e valor ao mesmo tempo. Como a comparação é > (e não >=), o segundo 45 não substitui o primeiro, e a posição guardada é a 1.
Quer praticar listas, dicionários e o resto da base da linguagem construindo projetos guiados? Conheça a Jornada Python, nosso curso de Python completo.
Conclusão
Neste guia completo sobre Listas, você aprendeu:
✅ Operações básicas - Criar, acessar, modificar
✅ Métodos essenciais - append, extend, insert, remove, pop, sort (e o que cada um retorna)
✅ Casos de uso reais - Filas, pilhas, processamento em lote, lista de dicionários
✅ Lista vs Tupla vs Array - Quando usar cada uma
✅ Erros comuns - IndexError, lista = lista.sort(), cópia por referência e remoção durante o for
Principais lições:
- Listas são mutáveis e versáteis
- Use tuplas para dados imutáveis
- Use numpy arrays para cálculos numéricos
-
.append()adiciona no final (O(1)) -
.pop(0)remove do início (O(n) - usedequese fizer muito)
Continue pela trilha de listas:
- Domine todos os métodos de manipulação de listas (append, sort, remove e cia.)
- Aprofunde o fatiamento (slicing) de listas com passo e índices negativos
- Pratique list comprehensions para gerar listas de forma mais Pythônica
- Explore
collections.dequepara filas eficientes
Dominá-las é muito importante e ajuda muito no dia a dia do desenvolvedor Python!
Nos vemos no próximo post, dev! ![]()
Perguntas frequentes
Como criar uma lista em Python?
Para criar uma lista em Python, envolva os elementos em colchetes separados por vírgula: lista = ['Python', 'Academy', 2021]. Use [] para uma lista vazia, list(range(5)) a partir de um intervalo ou uma list comprehension como [x for x in iteravel].
Como adicionar ou remover itens de uma lista?
Use .append(item) para adicionar no fim, .insert(i, item) em uma posição e .extend(outra) para concatenar. Para remover, use .remove(valor) pelo valor, .pop(i) pelo índice (devolvendo o item) ou del lista[i].
Como copiar uma lista sem criar um alias?
lista2 = lista1 cria um alias: os dois nomes apontam para o mesmo objeto, então mutar um afeta o outro. Para uma cópia independente use lista1.copy(), list(lista1) ou lista1[:]. Para listas aninhadas, use copy.deepcopy(lista1).
Como ordenar uma lista em Python?
Use lista.sort() para ordenar in-place (altera a própria lista) ou sorted(lista) para devolver uma nova lista ordenada. Para ordem decrescente, passe reverse=True; para um critério próprio, use o parâmetro key, como lista.sort(key=len).
Qual a diferença entre lista e tupla em Python?
A diferença entre lista e tupla é a mutabilidade: a lista ([]) é mutável e você pode adicionar, remover ou alterar itens; a tupla (()) é imutável. Use lista para coleções que mudam e tupla para dados fixos ou como chave de dicionário.
Pensando na manipulação de listas, qual a função de append, remove, insert e pop?
append(x) adiciona um elemento ao final da lista. remove(x) remove a primeira ocorrência do valor x e gera ValueError se ele não existir. insert(i, x) insere x na posição i, deslocando os demais para a direita. pop(i) remove e retorna o elemento da posição i; sem argumento, remove e retorna o último. Em questões de associar colunas, a diferença-chave é que remove recebe o valor e pop recebe o índice.
Por que a condição i < len(lista) é a mais usada ao percorrer listas com while?
Porque os índices de uma lista vão de 0 até len(lista) - 1. Com i < len(lista), o laço para logo depois do último índice válido. Usar i <= len(lista) tenta acessar lista[len(lista)] e gera IndexError: list index out of range. Em Python, porém, o mais idiomático é for item in lista ou for i, item in enumerate(lista).
Como percorrer uma lista em Python?
Use for item in lista: para visitar cada elemento em ordem. Se precisar também do índice, use for i, item in enumerate(lista):. Com while, controle o índice manualmente: comece com i = 0, use a condição while i < len(lista): e faça i += 1 no fim do bloco.
"Porque o Senhor dá a sabedoria, e da sua boca vem a inteligência e o entendimento" Pv 2:6