Saber se temos prémio no euromilhões e o seu valor não é tarefa difícil. Na solução abaixo admitimos que vamos ter a chave correcta e a nossa chave representadas por uma lista de dois elementos. O primeiro, é uma lista de cinco números e, o segundo, uma lista de dois números (as estrelas). Por outro lado o valor dos prémios está armazenado num dicionário em que a chave é um tuplo (n1, n2) que traduz quantos números e estrelas acertámos e o valor é o prémio.
def premio_euro(dicio,chave_certa, minha_chave):
# as chaves estão na forma [[5 números],[2 estrelas]]
# verifica números
num_certos = chave_certa[0]
num_meus = minha_chave[0]
conta_n = 0
for num in num_meus:
if num in num_certos:
conta_n += 1
# verifica estrelas
est_certas = chave_certa[1]
est_minhas = minha_chave[1]
conta_e = 0
for est in est_minhas:
if est in est_certas:
conta_e += 1
# calcula prémio
return dicio.get((conta_n,conta_e),0)
Problema 3Pretende-se normalizar os números guardados num ficheiro. Cada linha do ficheiro contém um nome e os números. A normalização é feita por linha, subtraindo a cada número a média dos valores dos números da linha e dividindo o resultado pelo respectivo desvio padrão.
import statistics
def normaliza_fich(fich_entrada, fich_saida):
# abre ficheiros
f_in = open(fich_entrada,'r',encoding='utf8')
f_out = open(fich_saida,'w',encoding='utf8')
# lê e normaliza por linha
for linha in f_in:
# recolhe nome e números
linha = linha.strip().split()
nome = linha[0]
numeros = [int(num) for num in linha[1:]]
# normaliza números
num_normais = normaliza(numeros)
# escreve resultado
nova_linha = nome + ' '.join([str(num) for num in num_normais]) + ‘\n'
f_out.write(nova_linha)
# fecha ficheiros
f_in.close()
f_out.close()
def normaliza(numeros):
media = statistics.mean(numeros)
desvio_pad = statistics.stdev(numeros)
return [(num - media)/desvio_pad for num in numeros]
A função auxiliar normaliza usa o módulo statistics para normalizar os números dados numa lista.

Sem comentários:
Enviar um comentário