Faça funções Python para:
Determinar o máximo e o mínimo de manchas solares em um período dado. Exemplo: de janeiro de 1818 a julho de 1834.
Determinar o máximo e o mínimo de manchas solares em um período dado. Exemplo: de janeiro de 1818 a julho de 1834.
Passo 1
Beleza, aqui a ideia é criar duas funções em Python que, dado um conjunto de dados de manchas solares (onde cada entrada tem uma data, tipo “janeiro/1818”, e o número de manchas naquele mês), retornem o valor máximo e o valor mínimo desse período.
Conteúdo da matéria: manipulação de listas, slicing (fatiamento) e uso das funções built-in
Conteúdo da matéria: manipulação de listas, slicing (fatiamento) e uso das funções built-in
max()
e min()
do Python; além de um jeitinho de filtrar datas.Passo 2
Primeiro, vamos entender como os dados estão estruturados. Supondo que você tenha uma lista assim:
dados = [
("1818-01", 15),
("1818-02", 23),
…
("1834-07", 5)
]
Cada tupla é (“ano-mês”, número_de_manchas). Aí precisamos transformar essas strings em algo que a gente possa comparar para “fatiar” o período desejado.
Passo 3
Para filtrar o período, a gente pode:
- transformar a data “YYYY-MM” em um número inteiro
YYYY*100 + MM
, - comparar esse inteiro com o início e o fim.
Exemplo: “1818-01” →
Dessa forma, fica fácil ver se
181801
.Dessa forma, fica fácil ver se
181801
está entre 181801
(“jan/1818”) e 183407
(“jul/1834”).Passo 4
Depois de filtrar, sobra só uma lista de valores de manchas. Aí aplicamos:
- valor máximo:
\max_i x_i = max(lista_de_valores) - valor mínimo:
\min_i x_i = min(lista_de_valores)
Passo 5
Bora juntar tudo numa função só. Vamos criar duas:
max_manchas(dados, inicio, fim)
e min_manchas(dados, inicio, fim)
.Resposta
def _date_para_int(ym):
# ym no formato "YYYY-MM"
ano, mes = ym.split('-')
return int(ano) * 100 + int(mes)
def _filtrar_periodo(dados, inicio, fim):
# inicio e fim no formato "YYYY-MM"
ini = _date_para_int(inicio)
fim = _date_para_int(fim)
# retorna só os valores de manchas dentro do período
return [
valor
for (ym, valor) in dados
if ini <= _date_para_int(ym) <= fim
]
def max_manchas(dados, inicio, fim):
"""
Retorna o número máximo de manchas solares
no período de inicio até fim (inclusive).
"""
valores = _filtrar_periodo(dados, inicio, fim)
if not valores:
raise ValueError("Nenhum dado no período solicitado")
return max(valores) # \max_i x_i
def min_manchas(dados, inicio, fim):
"""
Retorna o número mínimo de manchas solares
no período de inicio até fim (inclusive).
"""
valores = _filtrar_periodo(dados, inicio, fim)
if not valores:
raise ValueError("Nenhum dado no período solicitado")
return min(valores) # \min_i x_i
# Exemplo de uso:
# dados = [("1818-01",15), ("1818-02",23), ..., ("1834-07",5)]
# print(max_manchas(dados, "1818-01", "1834-07")) # ex: 100
# print(min_manchas(dados, "1818-01", "1834-07")) # ex: 5