2017-07-26 49 views
1

方法remove_item需要與add_item類似的參數。它應該刪除已添加到購物車並且不需要的商品。這種方法應該從當前總額中扣除這些項目的成本,並相應地更新項目字典。如果要移除的物品數量超過購物車中的當前數量,則假定該物品的所有條目都將被移除。python在迭代時修改dic刪除

class ShoppingCart(object): 
#constructor 
def __init__(self): 
    self.total = 0 
    self.items = {} 

#method to add items in the shoping cart 
def add_item(self,item_name, quantity, price): 
    self.total += (price * quantity) 
    self.items[item_name] = quantity 

#method to remove items 
def remove_item(self,item_name, quantity, price): 
    keys = self.items.keys() 
    for keys,v in self.items.items(): 
    if keys == item_name and quantity > self.items[keys]: #if item_name equals iterated item 
     self.total -= (price * quantity) 
     del(self.items[keys]) 
    del(self.items[keys]) 
    self.total -= (quantity * price) 

並有檢驗單位檢查

def test_add_item_hidden(self): 
    self.cart.add_item('Mango', 3, 10) 
    self.cart.add_item('Orange', 16, 10) 
    self.assertEqual(self.cart.total, 190, msg='Cart total not correct after adding items') 
    self.assertEqual(self.cart.items['Orange'], 16, msg='Quantity of items not correct after adding item') 

的方法remove_item給出了dictionary changed size during iteration甚至還試圖通過keys訪問如上圖所示

+1

'.keys'和'.items'返回一個* view *。使用'list'來獲得一個獨立的可迭代對象。 –

+0

錯誤是因爲您在迭代期間修改字典(刪除項目)。在迭代過程中嘗試將密鑰存儲到臨時列表中,例如「keys_to_delete」(在for循環中)並稍後刪除。 請參閱https://stackoverflow.com/questions/10665591/how-to-remove-list-elements-in-a-for-loop-in-python – Akshay

+2

juanpa.arrivillaga說什麼。順便說一句,'del'不是一個函數,所以不要把它寫成函數。擺脫這些括號。 –

回答

3

後,我覺得remove_item功能可能是一個錯誤更簡單。

#method to remove items 
def remove_item(self,item_name, quantity, price): 
    if item_name in self.item.keys(): 
     self.total -= (price * quantity) 
     del self.items[item_name] 

在這個版本中,你正在檢查是否item_name是字典,如果是這樣,你要刪除它,然後從total

試圖從一個字典,列表,typle去除去除價格同時遍歷它們通常不是一個好主意。

如果item_name是一個鍵列表,我必須假設數量和價格都是。 這樣一個可能的功能可能是:

def remove_item(self,item_name, quantity, price): 
    for index, value in enumerate(item_name): 
     if value in self.item.keys(): 
      self.total -= (price[index] * quantity[index]) 
      del self.items[value] 

我沒有測試,但應該工作。


如果想法是獲得物品的清單。函數應該是這樣的。

#method to remove items 
def remove_item(self,item_name, quantity, price): 
    if item_name in self.items.keys(): 
     #remove from total the price for the items 
     if quantity <= self.items[item_name]: 
      self.total -= (price * quantity) 
     else: 
      self.total -= (price * self.items[item_name]) 
     #if quantity is greater or equal of the current value, item is removed. 
     if quantity >= self.items[item_name] 
      del self.items[item_name] 
     else: 
      self.items[item_name] -= quantity 
+0

。 – fvidalmolina

+0

非常感謝。它工作完美。更讓你的解釋真棒。 –

+0

致各位評論和貢獻的人都很感激。 @PM 2ring感謝分享這一良好做法。 Adios全部 –