2015-01-29 4 views
-1

У меня есть следующий код:Не удается выяснить Python упражнение с словарями

shoppingList = ["banana","orange","apple"] 

inventory = {"banana": 6, 
    "apple": 0, 
    "orange": 32, 
    "pear": 15 
    } 

prices = {"banana": 4, 
    "apple": 2, 
    "orange": 1.5, 
    "pear": 3 
    } 

def calculateBill(food): 
    total = 0 
    for k in food: 
     total += prices[k] 
    return total 
calculateBill(shoppingList) 

упражнение говорит мне, чтобы завершить функцию, следуя эти инструкции:

  1. Не добавлять цену статьи в вашем счете, если она не находится в вашем инвентаре.
  2. После того, как вы купите статью, вычтите ее из инвентаря.

Я не знаю, как это сделать, и я не знаю, есть ли у меня какие-либо другие ошибки в моем коде.

Если непонятно, значение в инвентаре - это запас этого предмета, а стоимость в «ценах» - это цена.

+1

Итак, что вы пытались сделать, чтобы понять код, действительно? – Manhattan

+0

should comida = еда? – Stedy

+0

Я ничего не пробовал, потому что понятия не имею –

ответ

0

Прежде всего, я не вижу comida, определенного где-либо перед его использованием. Я буду считать, что на comida вы имеете в виду food.

Вот простое решение:

def calculateBill(food): 
    total = 0 
    for k in food: 
     if inventory.get(k, 0) > 0: 
      total += prices[k]    # updates total 
      inventory[k] = inventory[k] - 1 # updates inventory 
    return total 
+0

'Если инвентарь [k]> 0' дает' KeyError' при возможном предварительном условии –

+0

Есть лучший способ. 'if inventory.get (k, 0)> 0'. –

+0

@AdamSmith: Спасибо, я не знал об этом. (Я сам новичок python.) –

0

Вы можете сделать следующее

def calculateBill(food): 
    total = 0 
    for k in food: 
     if k in inventory: 
      if inventory[k] > 0: 
       total += prices[k] 
       inventory[k] = inventory[k] - 1 
      else: 
       print 'There are no %s in stock' % k 
     else: 
      print 'dont stock %s' % k 
    return total 

Для 1)

if k in inventory: 

будет проверить, если ключ присутствует в инвентаре Dict ,

Для 2)

inventory[k] = inventory[k] - 1 

будет вычитать 1 из инвентаря

Один недостаток этого кода является то, что он не проверяет, что счет инвентаризации выше 0, прежде чем позволить купить. Таким образом,

if inventory[k] > 0: 

Это.

+0

не нужно называть 'dict.keys' на инвентаре, просто делайте' if k in inventory', но есть более простой способ сделать это, используя 'dict.get' –

+0

@AdamSmith спасибо. –

0

Вот полное решение.

class Error(Exception): 
    """Base class for Exceptions in this module""" 
    pass 

class QtyError(Error): 
    """Errors related to the quantity of food products ordered""" 
    pass 

def calculateBill(food): 

    def buy_item(food_item, qty=1, inv_dict=None, prices_dict=None): 
     get_price = lambda item,price_dct: price_dct.get(item,9999999) 
     if inv_dict is None: 
      inv_dict = inventory 
     if prices_dict is None: 
      prices_dict = prices 
     if inv_dict.get(food_item, 0) >= qty: 
      inv_dict[food_item] -= qty 
      return sum(get_price(food_item, prices_dict) for _ in range(qty)) 
     else: 
      raise QtyError("Cannot purchase item '{0}' of quantity {1}, inventory only contains {2} of '{0}'".format(food_item, qty, inv_dict.get(food_item,0))) 

    total = sum(buy_item(food_item, 1, inventory, prices) for food_item in food) 
    return total 
Смежные вопросы