📊 Estruturas de Dados em Python

O que são Estruturas de Dados?

Estrutura de dados = forma de organizar múltiplos valores.

Analogia: - Uma variável = uma caixa com um item - Uma estrutura = uma caixa com vários itens organizados


📋 Listas (Arrays)

A estrutura mais usada em Python!

Criar uma Lista

# Lista vazia
lista_vazia = []

# Lista com valores
especies = ["Ulva", "Gracilaria", "Sargassum"]
temperaturas = [22.5, 23.1, 22.8, 23.4, 22.9]
dados_mistos = [1, "texto", 3.14, True, [1, 2, 3]]

# Usando list()
numeros = list(range(1, 6))  # [1, 2, 3, 4, 5]

Acessar Elementos

especies = ["Ulva", "Gracilaria", "Sargassum"]

# Índices começam em 0!
print(especies[0])   # "Ulva"
print(especies[1])   # "Gracilaria"
print(especies[2])   # "Sargassum"

# Índices negativos (do final para trás)
print(especies[-1])  # "Sargassum" (último)
print(especies[-2])  # "Gracilaria" (penúltimo)

Modificar Lista

especies = ["Ulva", "Gracilaria", "Sargassum"]

# Alterar elemento
especies[0] = "Ulva lactuca"

# Adicionar um elemento no final
especies.append("Laminaria")
print(especies)  # ["Ulva lactuca", "Gracilaria", "Sargassum", "Laminaria"]

# Inserir em posição específica
especies.insert(1, "Chondracanthus")
print(especies)  # ["Ulva lactuca", "Chondracanthus", ...]

# Remover elemento (por valor)
especies.remove("Sargassum")

# Remover elemento (por índice)
removida = especies.pop(0)  # Remove e retorna primeiro

# Remover tudo
especies.clear()

Operações com Listas

temperaturas = [22.5, 23.1, 22.8, 23.4, 22.9]

# Tamanho
print(len(temperaturas))  # 5

# Soma
print(sum(temperaturas))  # 114.7

# Máximo e mínimo
print(max(temperaturas))  # 23.4
print(min(temperaturas))  # 22.5

# Ordenar
ordenado = sorted(temperaturas)
print(ordenado)  # [22.5, 22.8, 22.9, 23.1, 23.4]

# Reverso
reverso = list(reversed(temperaturas))
print(reverso)  # [22.9, 23.4, 22.8, 23.1, 22.5]

# Verificar se contém
if 22.5 in temperaturas:
    print("✅ Encontrada")

# Contar ocorrências
amostras = ["Ulva", "Gracilaria", "Ulva", "Ulva", "Sargassum"]
print(amostras.count("Ulva"))  # 3

# Encontrar índice
print(amostras.index("Gracilaria"))  # 1

Fatiar Lista (Slicing)

especies = ["Ulva", "Gracilaria", "Sargassum", "Laminaria", "Chondracanthus"]

# [início:fim:passo] - fim é EXCLUSIVO!
print(especies[0:2])      # ["Ulva", "Gracilaria"]
print(especies[1:4])      # ["Gracilaria", "Sargassum", "Laminaria"]
print(especies[:3])       # ["Ulva", "Gracilaria", "Sargassum"] (começa do início)
print(especies[2:])       # ["Sargassum", "Laminaria", "Chondracanthus"] (até o fim)
print(especies[::2])      # ["Ulva", "Sargassum", "Chondracanthus"] (cada 2)
print(especies[::-1])     # Reverso! ["Chondracanthus", "Laminaria", ...]

Juntar e Dividir Listas

lista1 = [1, 2, 3]
lista2 = [4, 5, 6]

# Juntar
combinada = lista1 + lista2
print(combinada)  # [1, 2, 3, 4, 5, 6]

# Repetir
repetida = [1, 2] * 3
print(repetida)  # [1, 2, 1, 2, 1, 2]

# Dividir (string para lista)
texto = "Ulva,Gracilaria,Sargassum"
especies = texto.split(",")
print(especies)  # ["Ulva", "Gracilaria", "Sargassum"]

# Juntar (lista para string)
resultado = " | ".join(especies)
print(resultado)  # "Ulva | Gracilaria | Sargassum"

🔑 Dicionários (Dicts)

Dados com rótulo/chave.

Criar Dicionário

# Dicionário vazio
vazio = {}

# Com dados
amostra = {
    "id": 1,
    "especie": "Ulva lactuca",
    "profundidade": 5.2,
    "temperatura": 22.5,
    "valida": True
}

# Usando dict()
dados = dict(nome="Caetano", profissao="Oceanógrafo")

Acessar Valores

amostra = {
    "especie": "Ulva lactuca",
    "profundidade": 5.2,
    "temperatura": 22.5
}

# Acessar por chave
print(amostra["especie"])      # "Ulva lactuca"
print(amostra["profundidade"]) # 5.2

# Usando .get() (mais seguro)
print(amostra.get("especie"))        # "Ulva lactuca"
print(amostra.get("salario", "N/A")) # "N/A" (não existe)

Modificar Dicionário

amostra = {"especie": "Ulva", "profundidade": 5.2}

# Adicionar chave
amostra["temperatura"] = 22.5

# Modificar existente
amostra["profundidade"] = 6.0

# Remover chave
del amostra["temperatura"]

# Remover e retornar
valor = amostra.pop("profundidade")  # Remove e retorna 6.0

# Limpar tudo
amostra.clear()

Operações com Dicionários

amostra = {
    "especie": "Ulva",
    "profundidade": 5.2,
    "temperatura": 22.5,
    "valida": True
}

# Tamanho
print(len(amostra))  # 4

# Chaves
print(amostra.keys())  # dict_keys(['especie', 'profundidade', ...])

# Valores
print(amostra.values())  # dict_values(['Ulva', 5.2, 22.5, True])

# Pares chave-valor
print(amostra.items())  # dict_items([('especie', 'Ulva'), ...])

# Verificar se chave existe
if "especie" in amostra:
    print("✅ Existe")

# Atualizar múltiplas chaves
amostra.update({"profundidade": 7.0, "salinidade": 35.0})

Exemplo Prático: Registro de Amostra

# Criar vários registros
amostras = [
    {"id": 1, "especie": "Ulva", "prof_m": 5.2, "temp_c": 22.5},
    {"id": 2, "especie": "Gracilaria", "prof_m": 7.8, "temp_c": 23.1},
    {"id": 3, "especie": "Sargassum", "prof_m": 3.1, "temp_c": 22.8}
]

# Acessar
print(amostras[0]["especie"])  # "Ulva"
print(amostras[1]["temp_c"])   # 23.1

# Iterar
for amostra in amostras:
    print(f"ID {amostra['id']}: {amostra['especie']} a {amostra['prof_m']}m")

(Tuplas)

Listas imutáveis (não podem ser alteradas).

# Tupla (com parênteses)
coordenadas = (27.5, -48.5)  # latitude, longitude

# Acessar
print(coordenadas[0])  # 27.5
print(coordenadas[1])  # -48.5

# Tuplas são imutáveis
coordenadas[0] = 28.0  # ❌ ERRO!

# Mas podem ser reatribuídas
coordenadas = (28.0, -48.5)  # ✅ OK

# Desempacotamento
lat, lon = coordenadas
print(f"Latitude: {lat}, Longitude: {lon}")

# Múltiplos retornos de função
def get_localizacao():
    return (27.5, -48.5, 15)  # lat, lon, profundidade

lat, lon, prof = get_localizacao()

Quando usar: Quando você quer garantir que dados não sejam alterados.


⚙️ Conjuntos (Sets)

Coleções sem duplicatas.

# Criar conjunto
especies_unicas = {"Ulva", "Gracilaria", "Sargassum", "Ulva"}
print(especies_unicas)  # {'Ulva', 'Gracilaria', 'Sargassum'} - sem duplicata!

# Operações
especies_unicas.add("Laminaria")
especies_unicas.remove("Ulva")

# Interseção (elementos em comum)
grupo1 = {"Ulva", "Gracilaria", "Sargassum"}
grupo2 = {"Ulva", "Laminaria", "Codium"}
comuns = grupo1 & grupo2
print(comuns)  # {'Ulva'}

# União (tudo)
todos = grupo1 | grupo2
print(todos)  # {'Ulva', 'Gracilaria', 'Sargassum', 'Laminaria', 'Codium'}

# Diferença
so_em_grupo1 = grupo1 - grupo2

🔄 Loops com Estruturas

For Loop com Listas

especies = ["Ulva", "Gracilaria", "Sargassum"]

# Iterar valores
for especie in especies:
    print(f"Analisando: {especie}")

# Iterar com índice
for i, especie in enumerate(especies):
    print(f"{i}: {especie}")  # 0: Ulva, 1: Gracilaria, 2: Sargassum

# Iterar com range
for i in range(len(especies)):
    print(f"{i}: {especies[i]}")

For Loop com Dicionários

amostra = {"especie": "Ulva", "prof_m": 5.2, "temp_c": 22.5}

# Iterar chaves
for chave in amostra:
    print(chave)

# Iterar valores
for valor in amostra.values():
    print(valor)

# Iterar pares
for chave, valor in amostra.items():
    print(f"{chave}: {valor}")

While Loop

# Contar até 5
contador = 1
while contador <= 5:
    print(f"Contagem: {contador}")
    contador += 1

# Coletar dados até digitar "sair"
temperaturas = []
while True:
    temp = input("Digite temperatura (ou 'sair'): ")
    if temp.lower() == "sair":
        break
    temperaturas.append(float(temp))

print(f"Temperaturas coletadas: {temperaturas}")

💡 Compreensão de Listas (List Comprehension)

Forma elegante de criar listas:

# Forma tradicional
quadrados = []
for i in range(1, 6):
    quadrados.append(i ** 2)
print(quadrados)  # [1, 4, 9, 16, 25]

# Compreensão de lista (mais Pythônica)
quadrados = [i ** 2 for i in range(1, 6)]
print(quadrados)  # [1, 4, 9, 16, 25]

# Com condição
pares = [i for i in range(1, 11) if i % 2 == 0]
print(pares)  # [2, 4, 6, 8, 10]

# Exemplo oceanográfico
temperaturas_raw = [22.5, 23.1, 22.8, 23.4, 22.9]
# Arredondar todas para 1 casa decimal
temperaturas_limpas = [round(t, 1) for t in temperaturas_raw]
print(temperaturas_limpas)  # [22.5, 23.1, 22.8, 23.4, 22.9]

# Com transformação
especias_maiusculas = [sp.upper() for sp in ["Ulva", "Gracilaria"]]
print(especias_maiusculas)  # ['ULVA', 'GRACILARIA']

🎯 Exemplo Prático Completo

Crie arquivo analise_amostras.py:

"""
Sistema de análise de amostras de ficologia
"""

# Banco de dados de amostras
amostras = [
    {"id": 1, "especie": "Ulva lactuca", "prof_m": 5.2, "temp_c": 22.5, "sal_psu": 35.0},
    {"id": 2, "especie": "Gracilaria", "prof_m": 7.8, "temp_c": 23.1, "sal_psu": 34.8},
    {"id": 3, "especie": "Sargassum", "prof_m": 3.1, "temp_c": 22.8, "sal_psu": 35.1},
    {"id": 4, "especie": "Ulva lactuca", "prof_m": 6.5, "temp_c": 23.4, "sal_psu": 35.0},
]

print("=" * 60)
print("📊 ANÁLISE DE AMOSTRAS - LAFIC")
print("=" * 60)

# 1. Listar todas as amostras
print("\n📋 AMOSTRAS COLETADAS:")
for amostra in amostras:
    print(f"  #{amostra['id']}: {amostra['especie']} "
          f"({amostra['prof_m']}m, {amostra['temp_c']}°C)")

# 2. Encontrar espécie mais frequente
especies = [a["especie"] for a in amostras]
especie_freq = max(set(especies), key=especies.count)
print(f"\n🌿 Espécie mais frequente: {especie_freq}")

# 3. Média de profundidade
profundidades = [a["prof_m"] for a in amostras]
prof_media = sum(profundidades) / len(profundidades)
print(f"📏 Profundidade média: {prof_media:.1f}m")

# 4. Temperatura extrema
temp_minima = min(amostras, key=lambda x: x["temp_c"])
temp_maxima = max(amostras, key=lambda x: x["temp_c"])
print(f"🌡️ Temperatura: {temp_minima['temp_c']}°C (min) a {temp_maxima['temp_c']}°C (max)")

# 5. Filtrar amostras válidas
validas = [a for a in amostras if 20 <= a["temp_c"] <= 25]
print(f"\n✅ Amostras válidas: {len(validas)}/{len(amostras)}")

# 6. Relatório final
print("\n" + "=" * 60)
print("✓ Análise concluída com sucesso!")

Execute:

python analise_amostras.py

🎓 Checklist desta Lição

Se marcou tudo, você está pronto para Funções! 🎉


➡️ Próximo Tópico

👉 03-Funcoes-Modulos.html

Lá você aprenderá: - Definir funções - Parâmetros e retornos - Escopo de variáveis - Importar módulos


📝 Resumo de Operações

Estrutura Exemplo Mutável?
Lista [1, 2, 3] ✅ Sim
Dicionário {"a": 1} ✅ Sim
Tupla (1, 2, 3) ❌ Não
Conjunto {1, 2, 3} ✅ Sim

Você está aprendendo rápido! Próximo: Funções! 🚀