A média de n valores, x_{0}, x_{1}, \ldots, x_{n-1} ponderados pelos pesos w_{0}, w_{1}, \ldots, w_{n-1} é definida como
\bar{x}=\frac{1}{W} \sum_{i=0}^{n-1} w_{i} x_{i},
onde
W=\sum_{i=0}^{n-1} w_{i}.
Defina uma função media( \mathrm{x}, \mathrm{w} ) que receba uma lista de valores \boldsymbol{x} e uma lista de pesos \boldsymbol{w} e devolva a média ponderada.
Por exemplo:
Teste Resultado
print (media ([-5,2],[7,3])) -2.9

Passo 1

O enunciado pede para definir uma função chamada media(x, w) que receba duas listas: x contendo os valores x_{0}, x_{1}, \ldots, x_{n-1} e w contendo os pesos w_{0}, w_{1}, \ldots, w_{n-1}, e devolva a média ponderada desses valores. As informações relevantes dadas são:
  • A média ponderada é definida por \bar{x}=\frac{1}{W}\sum_{i=0}^{n-1} w_{i} x_{i}.
  • W=\sum_{i=0}^{n-1} w_{i} é a soma dos pesos.
  • No exemplo fornecido, x = [-5, 2] e w = [7, 3], e o resultado esperado do print(media([-5,2],[7,3])) é -2{,}9 (mostrado no teste como -2.9).

Passo 2

O que significa a fórmula e o que cada símbolo representa:
  • \bar{x} é a média ponderada que queremos calcular.
  • x_i é o i-ésimo valor da lista de valores.
  • w_i é o peso associado ao i-ésimo valor; pesos maiores dão mais influência a x_i.
  • W é a soma de todos os pesos: W=\sum_{i=0}^{n-1} w_i.
    A fórmula \bar{x}=\frac{1}{W}\sum_{i=0}^{n-1} w_i x_i diz: 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 x e w devem ter o mesmo comprimento n. Se não tiverem, a operação não faz sentido.
  • Se n=0 (listas vazias), não dá para calcular média — devemos sinalizar erro.
  • Se W=\sum w_i = 0, 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):
  1. Verificar se len(x) == len(w). Se não, lançar erro (por exemplo, ValueError).
  2. Verificar se len(x) > 0. Se não, lançar erro.
  3. Calcular o numerador: somar w_i \cdot x_i para todo i.
  4. Calcular o denominador W: somar todos os w_i.
  5. Se W == 0, lançar erro (ZeroDivisionError ou ValueError).
  6. Retornar o resultado da divisão numerador / W.

Passo 5

Vamos calcular manualmente o exemplo para entender e conferir:
  • Numerador: \sum_{i=0}^{1} w_i x_i = 7\cdot(-5) + 3\cdot 2 = -35 + 6 = -29.
  • Denominador: W = 7 + 3 = 10.
  • Média ponderada: \bar{x} = \dfrac{-29}{10} = -2{,}9.
    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

Exercícios relacionados