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:

PYTHON
# 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)     # []
💡 Listas são ordenadas — elementos mantêm a ordem em que você os adiciona, com posições fixas. Diferente de conjuntos, elementos de lista podem se repetir.


2. Acesso por Índice

A indexação de listas funciona exatamente como strings — começa em 0, suporta índices negativos:

PYTHON
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:

PYTHON
# print(fruits[10])   # IndexError: list index out of range

Exemplo: Obter Informações de Elemento da Lista (Dificuldade ⭐)

PYTHON
# 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}")
▶ Experimente

3. Operações CRUD em Listas

Listas são mutáveis — você pode modificá-las no lugar (diferente de strings).

Adicionando Elementos

PYTHON
# 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

PYTHON
# 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

PYTHON
scores = [60, 70, 80, 90]
scores[2] = 85              # Muda o terceiro para 85
print(scores)               # [60, 70, 85, 90]

Encontrando Elementos

PYTHON
# 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!
⚠️ Observação: Usar index() em um elemento inexistente levanta um erro. Use in primeiro para verificar com segurança.

Exemplo: Gerenciamento de Carrinho de Compras (Dificuldade ⭐⭐)

PYTHON
# 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}")
▶ Experimente

Saída:

TEXT
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

PYTHON
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]

PYTHON
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:

PYTHON
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 ⭐⭐)

PYTHON
# 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}")
▶ Experimente

Saída:

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

PYTHON
# "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 ⭐⭐⭐)

PYTHON
# 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]}")
▶ Experimente

Saída:

TEXT
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


❓ 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ções in. ⚠️ P: Qual a diferença entre append() e extend()? 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]], enquanto a.extend([3,4]) resulta em [1,2,3,4]. P: O que acontece se eu tentar remove() em um elemento inexistente? R: Levanta um ValueError. Então verifique com in primeiro: 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


📝 Atividades

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

  2. 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 como max(), min(), sum(), len().

  3. 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). Use while True para aceitar comandos continuamente; exit para sair. Dica: Use split(":") para analisar comandos.

100%