2017-07-26 4 views
1

Methode remove_item, die ähnliche Argumente wie add_item erfordert. Es sollte Artikel entfernen, die dem Warenkorb hinzugefügt wurden und nicht benötigt werden. Diese Methode sollte die Kosten dieser Artikel von der aktuellen Summe abziehen und auch die Artikel dict entsprechend aktualisieren. Wenn die Menge der zu entfernenden Artikel die aktuelle Menge im Einkaufswagen übersteigt, nehmen Sie an, dass alle Einträge dieses Artikels entfernt werden sollen.Python modifizieren dic Löschung während der Iteration

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) 

Und es gibt Testeinheiten

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') 

Verfahren zu überprüfen remove_item gibt einen Fehler, dass dictionary changed size during iteration auch nach dem Versuch, über keys zuzugreifen, wie oben

+1

'.keys' und' .items' geben eine * Ansicht * zurück. Verwenden Sie 'list', um ein unabhängiges iterierbares Objekt zu erhalten. –

+0

Fehler liegt daran, dass Sie das Wörterbuch (Elemente löschen) während der Iteration ändern. Versuchen Sie, während der Iteration (in for loop) Schlüssel zur temporären Liste wie "keys_to_delete" zu speichern und später zu löschen. Refer https://stackoverflow.com/questions/10665591/how-to-remove-list-elements-in-a-for-loop-in-python – Akshay

+2

Was juanpa.arrivillaga sagte. BTW, 'del' ist keine Funktion, also schreibe es nicht wie eine Funktion. Befreien Sie sich von diesen Klammern. –

Antwort

3

gezeigt Ich denke, die remove_item Funktion sein könnte einfacher.

#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] 

Mit dieser Version werden überprüft Sie, wenn item_name auf dem Wörterbuch ist, und wenn ja, können Sie es entfernen, und den Preis von total

Entfernen Der Versuch, aus einer dict, Liste, typle zu entfernen während über sie zu iterieren, ist normalerweise keine gute Idee.

Wenn item_name eine Liste von Schlüsseln ist, muss ich annehmen, dass Menge und Preis auch sind. so eine mögliche Funktion könnte sein:

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] 

ich nicht getestet haben, sollten aber funktionieren.


wenn die Idee ist, ein Inventar der Elemente zu erhalten. Die Funktion sollte in etwa so sein.

#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

bearbeitet unter Berücksichtigung der Menge für den Artikel. – fvidalmolina

+0

Vielen Dank. Es hat perfekt funktioniert. Mehr noch, deine Erklärung ist großartig. –

+0

An alle anderen, die kommentiert und beigetragen haben, bin ich dankbar. @ PM 2ring danke für das Teilen der guten Praxis. Adios alle –

Verwandte Themen