Escreva uma função que recebe uma lista de compras e um dicionário contendo o preço de cada produto disponível em uma determinada loja, e retorna o valor total dos itens da lista que estejam disponíveis nesta loja. Por exemplo, para os dados:
lista_de_compras = [‘biscoito’, ‘chocolate’, ‘farinha’]
Supermercado = {‘amaciante’:4.99,‘arroz’:10.90,‘biscoito’:1.69,
‘cafe’:6.98, ‘chocolate’:3.79,‘farinha’:2.99}
lista_de_compras = [‘biscoito’, ‘chocolate’, ‘farinha’]
Supermercado = {‘amaciante’:4.99,‘arroz’:10.90,‘biscoito’:1.69,
‘cafe’:6.98, ‘chocolate’:3.79,‘farinha’:2.99}
Passo 1
O que o enunciado pede e o que foi dado:
- Pede-se: escrever uma função que recebe dois argumentos — uma lista de compras e um dicionário com preços da loja — e retorna o valor total dos itens da lista que estejam disponíveis nessa loja.
- Dados fornecidos no enunciado:
- A lista de compras:
. - O dicionário de preços chamado Supermercado:
- A lista de compras:
- Clarificações importantes (decisões que a função fará automaticamente):
- Se um item da lista não estiver no dicionário da loja, esse item será simplesmente ignorado (não provoca erro).
- Se um item aparecer mais de uma vez na lista, seu preço será somado tantas vezes quanto aparecer (ou seja, considera-se quantidade implícita pela repetição).
- A correspondência entre nomes é exata (case-sensitive) a menos que seja feita normalização explícita.
Passo 2
Descrição do algoritmo simples e intuitivo (passo a passo mental antes do código):
- Criar uma variável acumuladora do tipo número chamada total e inicializá-la com zero.
- Percorrer cada item na lista de compras, um por vez.
- Para cada item:
- Verificar se o item está presente como chave no dicionário de preços.
- Se estiver, obter o preço e somá-lo ao acumulador total.
- Se não estiver, continuar para o próximo item sem somar nada.
- No final do percurso, retornar o valor do acumulador total.
Explicação rápida do porquê: isso garante que só somamos preços que existem na loja e evita erros ao tentar acessar chaves inexistentes.
Passo 3
Pequena aula sobre estruturas e operações usadas (dicionário, verificação de existência e soma):
- Dicionário em Python: é uma coleção de pares chave:valor. Para acessar o valor associado a uma chave usa-se a sintaxe
. Se tentar acessar uma chave que não existe, ocorre um erro. - Alternativa segura: usar
. Ex.: retorna o preço se existir ou caso contrário — útil para somar sem checar separadamente. - Verificar existência:
retorna verdadeiro se a chave aparece no dicionário. - Acumulação: iniciar
e a cada item fazer . Isso soma sucessivamente os preços. - Observação sobre números decimais e moeda: usar floats é prático; em aplicações financeiras reais recomenda-se tipos como Decimal para evitar problemas de precisão. Para a prova e exemplos simples, float e arredondamento a duas casas com
bastam.
Passo 4
Implementação didática em Python (versão clara com loop): explico cada linha no código logo abaixo.
def valor_total(lista_de_compras, precos_loja):
# inicializa o acumulador
total = 0.0
# percorre cada item da lista de compras
for item in lista_de_compras:
# obtém o preço do item na loja; se não existir, pega 0
preco = precos_loja.get(item, 0.0)
# soma ao acumulador
total += preco
# retorna o total (pode arredondar se quiser duas casas)
return round(total, 2)
Explicação linha a linha:
-
define a função com dois parâmetros: e . -
inicializa o acumulador em ponto flutuante. - O laço
visita cada produto da lista. -
tenta obter o preço; retorna se o item não existe no dicionário — assim não dá erro e itens ausentes são ignorados. -
é a forma curta de . -
devolve o total arredondado a duas casas decimais, apropriado para valores monetários.
Passo 5
Versão enxuta com compreensão e soma (mais “pythônica”) e explicação:
def valor_total_compacto(lista_de_compras, precos_loja):
return round(sum(precos_loja.get(item, 0.0) for item in lista_de_compras), 2)
- Aqui usamos
sobre um gerador que para cada item pega o preço com . É equivalente ao loop anterior, só mais compacto. - Ainda respeita as mesmas decisões (itens ausentes → ignora, repetições → conta várias vezes).
Passo 6
Aplicando ao exemplo dado, passo a passo com as somas:
- Itens da lista:
. - Preços (pegos do dicionário do enunciado):
-
- Soma passo a passo:
- Resultado final numérico:
.
Código de exemplo usando a função definida:
lista_de_compras = ['biscoito', 'chocolate', 'farinha']
Supermercado = {'amaciante':4.99,'arroz':10.90,'biscoito':1.69,
'cafe':6.98, 'chocolate':3.79,'farinha':2.99}
print(valor_total(lista_de_compras, Supermercado)) # saída: 8.47
Passo 7
Observações finais, dicas para a prova e variações que podem ser pedidas:
- Se pedirem ignorar duplicatas (ou seja, comprar apenas uma unidade de cada item independentemente de repetições), transforme a lista em conjunto com
antes de somar — cuidado: isso perde ordem e quantidade. - Se a correspondência for case-insensitive, normalize tudo para minúsculas antes de comparar: por exemplo, criar um dicionário com chaves em minúsculas e mapear os itens da lista com
. - Complexidade: o algoritmo proposto tem custo
onde é o tamanho da lista de compras (cada lookup em dicionário é, em média, ). - Para evitar problemas de precisão em somas de dinheiro em provas com cálculo manual, faça as somas mantendo centavos (por exemplo, trabalhando em inteiros de centavos) ou use arredondamento final como aqui.
Resposta
def valor_total(lista_de_compras, precos_loja):
total = 0.0
for item in lista_de_compras:
total += precos_loja.get(item, 0.0)
return round(total, 2)
Valor total para o exemplo: