A média de
valores,
ponderados pelos pesos
é definida como
,
onde
.
Defina uma função media(
) que receba uma lista de valores
e uma lista de pesos
e devolva a média ponderada.
Por exemplo:
Teste
Resultado
print (media
-2.9
onde
Defina uma função media(
| Teste | Resultado |
| print (media
|
-2.9 |
Passo 1
O enunciado pede para definir uma função chamada e , e devolva a média ponderada desses valores. As informações relevantes dadas são:
media(x, w) que receba duas listas: x contendo os valores
w contendo os pesos
- A média ponderada é definida por
. -
é a soma dos pesos. - No exemplo fornecido,
x = [-5, 2]ew = [7, 3], e o resultado esperado doprint(media([-5,2],[7,3]))é(mostrado no teste como -2.9).
Passo 2
O que significa a fórmula e o que cada símbolo representa:
-
é a média ponderada que queremos calcular. -
é o -ésimo valor da lista de valores. -
é o peso associado ao -ésimo valor; pesos maiores dão mais influência a . -
é a soma de todos os pesos: .
A fórmuladiz: multiplicamos cada valor pelo seu peso, somamos tudo (isso é o numerador) e dividimos pela soma dos pesos (o denominador) para normalizar.
Passo 3
Regras práticas e casos a tratar na função (coisas que você deve garantir na prova):
- As duas listas
xewdevem ter o mesmo comprimento. Se não tiverem, a operação não faz sentido. - Se
(listas vazias), não dá para calcular média — devemos sinalizar erro. - Se
, ocorre divisão por zero — devemos sinalizar erro também. - Para evitar problemas de divisão inteira (em Python 2 antiga) ou para garantir precisão, é bom fazer a divisão como ponto flutuante. Em Python 3 a divisão já é em float, mas não custa garantir que numerador e denominador sejam numéricos.
Passo 4
Algoritmo passo a passo que vamos implementar (em linguagem natural):
- Verificar se
len(x) == len(w). Se não, lançar erro (por exemplo,ValueError). - Verificar se
len(x) > 0. Se não, lançar erro. - Calcular o numerador: somar
para todo . - Calcular o denominador
: somar todos os . - Se
, lançar erro ( ZeroDivisionErrorouValueError). - Retornar o resultado da divisão
numerador / W.
Passo 5
Vamos calcular manualmente o exemplo para entender e conferir:
- Numerador:
. - Denominador:
. - Média ponderada:
.
Em Python o resultado será mostrado como-2.9(ponto decimal), que é equivalente ao valor acima.
Passo 6
Implementação em Python com comentários explicando cada linha. Essa função segue as regras e trata casos de erro; é exatamente o que você deve escrever na prova ou num trabalho prático.
def media(x, w):
"""
Calcula a média ponderada dos valores na lista x com os pesos na lista w.
Raises ValueError se listas tiverem tamanhos diferentes, se estiverem vazias,
ou se a soma dos pesos for zero.
"""
# 1) checar comprimento
if len(x) != len(w):
raise ValueError("As listas x e w devem ter o mesmo comprimento")
# 2) checar que não estão vazias
if len(x) == 0:
raise ValueError("As listas não podem ser vazias")
# 3) calcular numerador e denominador
numerador = 0.0
denominador = 0.0
for xi, wi in zip(x, w):
numerador += wi * xi
denominador += wi
# 4) checar divisão por zero
if denominador == 0:
raise ValueError("A soma dos pesos (W) é zero; divisão por zero")
# 5) retorno da média ponderada
return numerador / denominador
# Exemplo de uso:
# print(media([-5, 2], [7, 3])) # saída: -2.9
Resposta
def media(x, w):
"""
Calcula a média ponderada dos valores na lista x com os pesos na lista w.
Raises ValueError se listas tiverem tamanhos diferentes, se estiverem vazias,
ou se a soma dos pesos for zero.
"""
if len(x) != len(w):
raise ValueError("As listas x e w devem ter o mesmo comprimento")
if len(x) == 0:
raise ValueError("As listas não podem ser vazias")
numerador = 0.0
denominador = 0.0
for xi, wi in zip(x, w):
numerador += wi * xi
denominador += wi
if denominador == 0:
raise ValueError("A soma dos pesos (W) é zero; divisão por zero")
return numerador / denominador