The function item is modifying the price value because you do p['preco'] = valor, then it doesn’t seem to be what you need.
Moreover, map serves to apply a function to all elements of an iterable, returning the results of this function (in case, it is using the function item, that changes prices, so the return has changed prices).
If you want to fetch the lowest price, use min:
def menorpreco(arroz):
return min(arroz, key=lambda d : d['preco'])
arroz = [
{'item': 'arroz', 'preco': 20.15, 'mercado': 'mercado_1'},
{'item': 'arroz', 'preco': 19.99, 'mercado': 'mercado_2'},
{'item': 'arroz', 'preco': 22.00, 'mercado': 'mercado_3'},
{'item': 'arroz', 'preco': 17.99, 'mercado': 'mercado_4'}]
mais_barato = menorpreco(arroz)
print(mais_barato) # {'item': 'arroz', 'preco': 17.99, 'mercado': 'mercado_4'}
The parameter key indicates which value will be used in comparison, and in case I used the price.
The return is the entire dictionary that contains the lowest price. But if you just want the value, just do mais_barato['preco'].
But in case of a tie (has more than one item that is the cheapest), you can return a list with the cheapest items:
def menorpreco(arroz):
# primeiro vê qual o menor preço
menor_preco = min(arroz, key=lambda d : d['preco'])['preco']
# retorna uma lista com todos os itens cujo preço é igual ao menor_preco
return [ item for item in arroz if item['preco'] == menor_preco]
arroz = [
{'item': 'arroz', 'preco': 20.15, 'mercado': 'mercado_1'},
{'item': 'arroz', 'preco': 17.99, 'mercado': 'mercado_5'},
{'item': 'arroz', 'preco': 19.99, 'mercado': 'mercado_2'},
{'item': 'arroz', 'preco': 22.00, 'mercado': 'mercado_3'},
{'item': 'arroz', 'preco': 17.99, 'mercado': 'mercado_4'}]
print(menorpreco(arroz)) # [{'item': 'arroz', 'preco': 17.99, 'mercado': 'mercado_5'}, {'item': 'arroz', 'preco': 17.99, 'mercado': 'mercado_4'}]
Thank you. helped me and a lot in understanding. vlw
– Radis Silva