2016-11-15 47 views
0

問題:定義貨架(庫存,所屬類別):它涉及到字典

這是一個家庭作業的最後一個問題,它是造成我最煩惱。我花了這麼多時間,但我無法得到正確的結果。我不確定錯誤是什麼,我認爲這是一個邏輯錯誤。我不會總結,而是完整地複製作業,以避免混淆。解釋如何達成解決方案的詳細迴應也會有所幫助,因爲我希望更好地理解這個概念。

我們希望通過跟蹤我們目前擁有的每種 產品的數量來跟蹤我們商店的庫存。我們將使用名稱爲:金額鍵值 對的字典。該名稱是一個字符串,金額是一個整數。

我們將定義擱置函數,該函數接受字典作爲庫存 和(名稱,數字)對的列表,每個對都指示我們應該通過向其添加數字來更新該已命名產品的庫存。 (該數字可能是 否定的)。第二個參數被命名爲product_list。 第一次提及產品時,需要將其添加到 庫存字典中。當其數量達到零時,它應該保留在零庫存的 庫存中。但伯爵絕不能成爲負面的。 如果任何特定商品的庫存變爲負值,則必須提高 ValueError以指示某些商品的金額低於零。 - 返回值:無。 (對庫存進行更改)。 - 建議:使用try-except塊添加項目。 (儘管你可能會找到其他的解決方案,那沒關係)。 - 要求:每當一個項目的計數變爲負值時提高ValueErrors;在構造異常時使用 字符串「產品負數」。

例子:

d = {"apple":50, "pear":30, "orange":25} 

ps = [("apple",20),("pear",-10),("grape",18)] 

shelve(d,ps) 
d 
{'pear': 20, 'grape': 18, 'orange': 25, 'apple': 70} 

shelve(d,[("apple",-1000)]) 
Traceback (most recent call last): 

ValueError: negative amount for apple 

我的代碼:

def shelve(inventory,product_list): 
    invt = {} 
    count = 0 
    try: 
     for x in product_list: 
      if x== True: 
       invt{x} = product_list.shelve{x} 
       count += key 

    except ValueError: 
    print ('negative amount for (product)') 

其他例子:

檢查d = {"apple":50} shelve(d,[("apple",20),("apple",-30)])修改d{"apple":40}

檢查shelve({}, [("apple",-20)])是否產生了ValueError

謝謝你的幫助。

+0

如果你擱置({},[('apple',-20),('apple,30)])'應該引發ValueError還是'{'apple':10}'會發生什麼? –

+0

你有'除了ValueError'那裏 - 應該只是'ValueError'除外? –

+0

@StevenSummers我認爲它應該返回{'apple':10} – Soccerninja

回答

0

假設如果字典中的某些值在向其中添加一些數字後變爲負值,則會引發ValueError異常並反轉該操作。

def shelve(inventory, product_list): 
    # Here you iterate through the product_list. 
    for p in product_list:  
     # The product_list contains pairs (tuples), e.g. ('apple', 20) and you 
     # check if the first element of the pair, i.e. p[0] exists as a key 
     # in the dictionary. 
     if p[0] in inventory: 
      # You use try-except to raise and then handle the exception 
      try: 
       # If key p[0] exists in the dictionary then you add the value from the pair, i.e. p[1] to existing key's value in the dictionary 
       inventory[p[0]] += p[1] 
       # If the value of the key p[0] is negative you raise an exception with the message in the parentheses 
       if inventory[p[0]] < 0: 
        raise ValueError('negative amount for product') 
      # Here you handle the exception. You print the message and subtract the value you added. 
      except ValueError as ve: 
       print(ve) 
       inventory[p[0]] -= p[1] 
     # If the key p[0] does not exist in the dictionary, then you add it to the dictionary and assign value p[1] to it. 
     else: 
      inventory[p[0]] = p[1] 
    #Here you just print the contents of inventory 
    print(inventory)   

# These are just examples to test the code. 
d = {"apple":50, "pear":30, "orange":25} 
ps = [("apple",20),("pear",-10),("grape",18)] 

shelve(d, ps) 
shelve(d,[("apple",-1000)]) 

這只是你如何解決你的任務的一個例子。還有其他的(可能更好)變種。

+0

你能解釋你做了什麼嗎?我對你所做的並不積極。 – Soccerninja

+0

@Soccerninja我添加了評論。希望這可以幫助。 – Nurjan

1

給出的答案的意見和假設你需要避免的副作用,如果任何庫存物品會去下面0

def shelve(inventory, product_list): 
    adj = dict(inventory) 
    for product, amount in product_list: 
     adj[product] = adj.get(product, 0) + amount 

    if any(v < 0 for v in adj.values()): 
     raise ValueError("Negative amount for product") 

    inventory.update(adj) 

>>> d = {"apple":50, "pear":30, "orange":25} 
>>> shelve(d, [("apple",20),("pear",-10),("grape",18)]) 
>>> d 
{'apple': 70, 'grape': 18, 'orange': 25, 'pear': 20} 
>>> shelve(d,[("apple",-1000)]) 
ValueError        Traceback (most recent call last) 
... 
ValueError: Negative amount for product 
0

下面的代碼將執行必要的檢查(閱讀評論):

d = {"apple":50, "pear":30, "orange":25} 
ps = [("apple",20),("pear",-10),("grape",18)] 


def shelve(sh: dict, items: list) -> dict: 
    for name, value in items: # iterate over list and split tuples 
     if name not in sh: # add item key if it doesn't already exist 
      sh[name] = 0 

     if sh[name] + value < 0: # raise ValueError if sum will be negative 
      raise ValueError('negative amount for (%s)' % name) 

     sh[name] += value # apply change to dictionary 

    return sh # not necessary but can be good for testing 

此代碼應該相當快,因爲​​它不會花時間遍歷整個字典。