Fundamentos de Listas
Nas lições anteriores, variáveis só podiam conter um valor. Mas na vida real, dados raramente vêm como singleton — carrinhos de compras têm múltiplos itens, rankings têm múltiplas entradas, artigos têm múltiplos parágrafos. Listas são projetadas para conter "uma coleção de dados." São a estrutura de dados mais flexível e comumente usada do Python.
1. O que é uma Lista
Uma lista é definida com colchetes [], elementos separados por vírgulas. Podem conter elementos de diferentes tipos:
# Lista de inteiros
numbers = [1, 2, 3, 4, 5]
# Lista de strings
fruits = ["maçã", "banana", "laranja"]
# Tipos mistos
mixed = [1, "hello", True, 3.14]
# Lista vazia
empty = []
print(numbers) # [1, 2, 3, 4, 5]
print(fruits) # ['maçã', 'banana', 'laranja']
print(empty) # []
2. Acesso por Índice
A indexação de listas funciona exatamente como strings — começa em 0, suporta índices negativos:
fruits = ["maçã", "banana", "laranja", "uva", "melancia"]
# Positivo: começa em 0
print(fruits[0]) # maçã
print(fruits[2]) # laranja
print(fruits[4]) # melancia
# Negativo: começa em -1 (último)
print(fruits[-1]) # melancia
print(fruits[-2]) # uva
print(fruits[-5]) # maçã
Acessar um índice fora do intervalo causa um erro:
# print(fruits[10]) # IndexError: list index out of range
Exemplo: Obter Informações de Elemento da Lista (Dificuldade ⭐)
# Dada uma lista de alunos
students = ["Alice", "Bob", "Charlie", "David", "Eve"]
# Primeiro e último
first = students[0]
last = students[-1]
print(f"Primeiro aluno: {first}")
print(f"Último aluno: {last}")
# Primeiros três
top3 = students[:3] # Fatiamento
print(f"Top 3: {top3}")
# Comprimento da lista
count = len(students)
print(f"Total de alunos: {count}")
3. Operações CRUD em Listas
Listas são mutáveis — você pode modificá-las no lugar (diferente de strings).
Adicionando Elementos
# append() — adiciona ao final
cities = ["São Paulo", "Rio de Janeiro"]
cities.append("Belo Horizonte")
print(cities) # ['São Paulo', 'Rio de Janeiro', 'Belo Horizonte']
# insert() — insere em uma posição específica
cities.insert(1, "Salvador")
print(cities) # ['São Paulo', 'Salvador', 'Rio de Janeiro', 'Belo Horizonte']
# extend() — mescla outra lista
more_cities = ["Fortaleza", "Curitiba"]
cities.extend(more_cities)
print(cities) # ['São Paulo', 'Salvador', 'Rio de Janeiro', 'Belo Horizonte', 'Fortaleza', 'Curitiba']
Removendo Elementos
# pop() — remove e retorna o elemento em uma posição (padrão último)
cities = ["São Paulo", "Rio de Janeiro", "Belo Horizonte", "Salvador"]
last = cities.pop() # Remove e retorna último
print(f"Removido: {last}") # Salvador
print(cities) # ['São Paulo', 'Rio de Janeiro', 'Belo Horizonte']
first = cities.pop(0) # Remove primeiro
print(f"Removido: {first}") # São Paulo
print(cities) # ['Rio de Janeiro', 'Belo Horizonte']
# remove() — remove o primeiro valor correspondente
cities = ["São Paulo", "Rio de Janeiro", "Belo Horizonte", "Rio de Janeiro"]
cities.remove("Rio de Janeiro") # Apenas remove o primeiro "Rio de Janeiro"
print(cities) # ['São Paulo', 'Belo Horizonte', 'Rio de Janeiro']
# clear() — remove todos os elementos
cities.clear()
print(cities) # []
Modificando Elementos
scores = [60, 70, 80, 90]
scores[2] = 85 # Muda o terceiro para 85
print(scores) # [60, 70, 85, 90]
Encontrando Elementos
# in — verifica se elemento existe
fruits = ["maçã", "banana", "laranja"]
print("maçã" in fruits) # True
print("uva" in fruits) # False
# index() — encontra posição
print(fruits.index("banana")) # 1
# print(fruits.index("uva")) # ValueError!
index() em um elemento inexistente levanta um erro. Use in primeiro para verificar com segurança.
Exemplo: Gerenciamento de Carrinho de Compras (Dificuldade ⭐⭐)
# Simula um carrinho de compras com uma lista
cart = []
# Adiciona itens
cart.append("maçã")
cart.append("leite")
cart.append("pão")
cart.append("maçã") # Duplicatas permitidas
print(f"Carrinho: {cart}")
# Verifica quantidade
print(f"Total de itens: {len(cart)}")
# Modifica — muda primeira maçã para "maçã (pacote de 2)"
cart[0] = "maçã (pacote de 2)"
print(f"Após atualização: {cart}")
# Remove último item
removed = cart.pop()
print(f"Removido: {removed}")
print(f"Carrinho final: {cart}")
Saída:
Carrinho: ['maçã', 'leite', 'pão', 'maçã']
Total de itens: 4
Após atualização: ['maçã (pacote de 2)', 'leite', 'pão', 'maçã']
Removido: maçã
Carrinho final: ['maçã (pacote de 2)', 'leite', 'pão']
4. Ordenação e Inversão
numbers = [3, 1, 4, 1, 5, 9, 2]
# sort() — ordenação no lugar (modifica a lista original)
numbers.sort()
print(numbers) # [1, 1, 2, 3, 4, 5, 9]
# sort(reverse=True) — decrescente
numbers.sort(reverse=True)
print(numbers) # [9, 5, 4, 3, 2, 1, 1]
# reverse() — inverte a ordem
numbers.reverse()
print(numbers) # [1, 1, 2, 3, 4, 5, 9]
# sorted() — retorna uma nova lista, não modifica a original
numbers = [3, 1, 4, 1, 5]
sorted_nums = sorted(numbers)
print(sorted_nums) # [1, 1, 3, 4, 5]
print(numbers) # [3, 1, 4, 1, 5] (inalterado)
sort() vs sorted()? Se você não precisa da ordem original, use sort() (mais rápido, mais eficiente em memória). Se você precisa preservar a ordem original, use sorted().
5. Fatiamento de Listas
O fatiamento funciona da mesma forma que com strings: lista[início:fim:passo]
nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(nums[2:6]) # [2, 3, 4, 5]
print(nums[:4]) # [0, 1, 2, 3] — primeiros 4
print(nums[6:]) # [6, 7, 8, 9] — do 6 ao fim
print(nums[::2]) # [0, 2, 4, 6, 8] — a cada 2
print(nums[::-1]) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] — invertido
O fatiamento também suporta atribuição — um recurso único das listas:
nums = [0, 1, 2, 3, 4, 5]
# Substitui uma fatia
nums[1:4] = [10, 20, 30]
print(nums) # [0, 10, 20, 30, 4, 5]
# Remove uma fatia
nums[1:4] = []
print(nums) # [0, 4, 5]
Exemplo: Paginação com Fatiamento (Dificuldade ⭐⭐)
# Exibição paginada — 3 itens por página
items = ["Item A", "Item B", "Item C", "Item D", "Item E", "Item F", "Item G"]
page_size = 3
total_pages = (len(items) + page_size - 1) // page_size
for page in range(total_pages):
start = page * page_size
end = start + page_size
page_items = items[start:end]
print(f"Página {page + 1}: {page_items}")
Saída:
Página 1: ['Item A', 'Item B', 'Item C']
Página 2: ['Item D', 'Item E', 'Item F']
Página 3: ['Item G']
6. Listas Aninhadas
Elementos de lista podem eles próprios ser listas — isso é chamado de lista aninhada (ou lista 2D).
# "Matriz" 3x4
matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
]
# Acesso: primeira linha, depois coluna
print(matrix[0]) # [1, 2, 3, 4] — primeira linha
print(matrix[1][2]) # 7 — segunda linha, terceira coluna
print(matrix[2][0]) # 9 — terceira linha, primeira coluna
Exemplo: Tabela de Notas de Alunos (Dificuldade ⭐⭐⭐)
# Armazena notas de alunos em uma lista aninhada
# Cada linha: [nome, Português, Matemática, Inglês]
scores = [
["Alice", 85, 92, 78],
["Bob", 90, 88, 95],
["Charlie", 76, 85, 82],
]
# Calcula e exibe a média de cada aluno
for student in scores:
name = student[0]
avg = (student[1] + student[2] + student[3]) / 3
print(f"{name}: Média {avg:.1f}")
# Exibe todas as notas de Matemática
print("Notas de Matemática:")
for student in scores:
print(f" {student[0]}: {student[1]}")
Saída:
Alice: Média 85.0
Bob: Média 91.0
Charlie: Média 81.0
Notas de Matemática:
Alice: 85
Bob: 90
Charlie: 76
Casos de Uso Comuns
- Lista de tarefas:
append()para adicionar tarefas,pop()para completar e remover,sort()por prioridade. - Fila: Primeiro a entrar, primeiro a sair —
append()para enfileirar,pop(0)para desenfileirar. - Coleta de dados:
append()resultados em um laço, analise todos de uma vez. - Paginação: Fatia
lista[início:fim]para paginação de dados. - Operações matriciais: Listas 2D para dados tabulares, acesso por índice de linha e coluna.
❓ Perguntas Frequentes
P: Qual a diferença entre listas e strings? R: A principal diferença é que listas são mutáveis (podem ser modificadas), enquanto strings são imutáveis (não podem alterar a original). Listas podem conter diferentes tipos de dados; strings só podem conter caracteres. Similaridades: ambas suportam indexação, fatiamento,
len()e operaçõesin. ⚠️ P: Qual a diferença entreappend()eextend()? R:append()adiciona o argumento inteiro como um único elemento — se você passar uma lista, ela se torna uma lista aninhada.extend()adiciona cada elemento do argumento individualmente.a = [1,2]; a.append([3,4])resulta em[1,2,[3,4]], enquantoa.extend([3,4])resulta em[1,2,3,4]. P: O que acontece se eu tentarremove()em um elemento inexistente? R: Levanta umValueError. Então verifique cominprimeiro:if "xxx" in my_list: my_list.remove("xxx"). Ou use uma list comprehension para criar uma nova lista filtrada:new_list = [x for x in my_list if x != "xxx"](aprenderemos isso na próxima lição).
📖 Resumo
- Listas usam
[], ordenadas, mutáveis, permitem duplicatas, podem conter tipos diferentes - Indexação começa em 0, suporta índices negativos; fatiamento funciona como strings
- Adicionar:
append()no final,insert()em posição,extend()para mesclar - Remover:
pop()retorna o removido,remove()por valor,clear()tudo - Modificar:
lista[índice] = novo_valor - Verificar:
inpara existência,index()para posição - Ordenar:
sort()no lugar,sorted()retorna nova lista - Listas aninhadas permitem estruturas de dados 2D, acessadas via
lista[linha][col]
📝 Atividades
-
Básico (Dificuldade ⭐): Crie uma lista de 5 filmes que você gosta. Use
append()para adicionar um novo,pop()para remover o último,sort()em ordem alfabética, depois exiba o comprimento da lista. -
Intermediário (Dificuldade ⭐⭐): Dado
numbers = [23, 45, 12, 67, 34, 89, 5, 18], encontre e exiba o máximo, mínimo, soma e média. Dica: Use funções embutidas comomax(),min(),sum(),len(). -
Desafio (Dificuldade ⭐⭐⭐): Escreva um "Gerenciador de Lista de Tarefas." Use uma lista para armazenar tarefas. Suporte:
add:Comprar leite,done:2(remove por número),list(mostrar todas). Usewhile Truepara aceitar comandos continuamente;exitpara sair. Dica: Usesplit(":")para analisar comandos.



