2017-07-26 16 views
1

add_itemと同様の引数を必要とするメソッドremove_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_itemdictionary changed size during iteration

+1

'.keys'と' .items'は* view *を返します。独立したiterableオブジェクトを得るには 'list'を使います。 –

+0

エラーは、反復中に辞書を変更している(アイテムを削除している)ためです。反復中(forループ内)に "keys_to_delete"のような一時的なリストにキーを格納し、後で削除してください。 を参照してください。https://stackoverflow.com/questions/10665591/how-to-remove-list-elements-in-a-for-loop-in-python – Akshay

+2

juanpa.arrivillagaが言ったこと。ところで、 'del'は関数ではないので、関数のように書く必要はありません。それらのかっこを取り除く。 –

答えて

3

上に示したようkeysを経由してアクセスしようとした後、私は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

アイテムの数量をaccounと取って編集。 – fvidalmolina

+0

ありがとうございました。それは完璧に働いた。もっとあなたの説明は最高です。 –

+0

コメントして貢献した他の人たちには感謝しています。 @PM良い実践を分かち合いに感謝します。アディオスオール –

関連する問題