代码之家  ›  专栏  ›  技术社区  ›  vkk07

嵌套dict python中的购物车总价

  •  0
  • vkk07  · 技术社区  · 6 年前

    我想用下面的代码计算我的购物车中的总价,但是我不能重复我的项目dict中的价格。这里缺少一些东西。另外,如果for循环是固定的,那么有没有什么方法可以使用理解进行迭代?

    class ShoppingCart(object):
        def __init__(self):
            self.item = None
            self.quantity = None
            self.price = None
            self.items = {}
        def add(self, item, price, quantity):
    
            if item in self.items:
                previous_quantity = self.items[item]['quantity']
                previous_price = self.items[item]['price']
    
                self.items[item] = {'quantity': previous_quantity +   quantity,
                                    'price': previous_price + price}
            else:
                self.items[item] = {'quantity':quantity,
                               'price':price}
    
        def total_items_in_cart(self):
             print(len(self.items))
    
        def total_items_price_in_cart(self):
             print(sum([price
                     for price in self.items.values()]))
    
    sc = ShoppingCart()
    sc.add('book', 30, 1)
    # sc.add('book', 132, 1)
    
    sc.add('toothbrush', 4, 10)
    # sc.add('toothbrush', 5, 20)
    
    # sc.total_items_in_cart()
    
    cart_price_total = []
    for item, value in sc.items.items():
        print("\n{}".format(item))
        for price,qty in value.items():
            print("{} :{}".format(price, qty))
            cart_price_total.append(qty)
    
    print(cart_price_total) # this does not print what I want... 
    

    有没有一种方法可以使用理解来获取我的购物车中的总价值?

    编辑:

    I added the data using a tuple, and it seems simple now. Cannot figure out why...
    
    class ShoppingCart(object):
        def __init__(self):
            self.item = None
            self.quantity = None
            self.price = None
            self.items = {}
        def add(self, item, price, quantity):
            if item in self.items:
                previous_quantity = self.items[item]['quantity']
                previous_price = self.items[item]['price']
                self.items[item] = (previous_quantity+quantity, previous_price+price)
            else:
                self.items[item] = (price, quantity)
    
        def total_items_in_cart(self):
             return(len(self.items))
    
        def total_items_price_in_cart(self):
             return(sum([price
                     for price, quantity in self.items.values()]))
    
    sc = ShoppingCart()
    sc.add('book', 30, 1)
    sc.add('toothbrush', 4, 10)
    print(sc.total_items_in_cart())
    print(sc.total_items_price_in_cart())
    
    3 回复  |  直到 6 年前
        1
  •  1
  •   AGN Gazer    6 年前

    我只需要定义一个新的实例变量,例如 _total_price 并在添加项目时保持更新:

    class ShoppingCart(object):
        def __init__(self):
            self.item = None
            self.quantity = None
            self.price = None
            self.items = {}
            self._total_price = 0
    
        def add(self, item, price, quantity):
            if item in self.items:
                previous_quantity = self.items[item]['quantity']
                previous_price = self.items[item]['price']
                self.items[item] = {'quantity': previous_quantity + quantity,
                                    'price': previous_price + price}
            else:
                self.items[item] = {'quantity':quantity, 'price':price}
            self._total_price += price * quantity
    
        @property
        def total_items_in_cart(self):
            return len(self.items) # better return a value instead of printing it
    
        @property
        def total_items_price_in_cart(self):
            return self._total_price
    
    sc = ShoppingCart()
    sc.add('book', 30, 1)
    # sc.add('book', 132, 1)
    
    sc.add('toothbrush', 4, 10)
    # sc.add('toothbrush', 5, 20)
    
    print(sc.total_items_in_cart)
    print(sc.total_items_price_in_cart)
    

    当然,当用户想要从购物车中删除商品时,您需要处理这个案例。

        2
  •  1
  •   Ivan Vinogradov    6 年前

    改变你的 total_items_price_in_cart 功能:

    def total_items_price_in_cart(self):
        items_prices = {k: v['price'] * v['quantity'] for (k, v) in self.items.items()}
        # items_prices == {'book': 30, 'toothbrush': 40}
        return sum(items_prices.values())
    

    有问题的输入数据的输出:

    70

        3
  •  0
  •   Ivan Vinogradov    6 年前

    你的 ShoppingCart 类具有price属性,但您不使用它。 你应该只使用你的 self.items = {} ,您不使用 self.item , self.quantity self.price .

    print(cart_price_total) # this does not print what I want...
    

    是的,但似乎您的购物车价格总和不考虑您的物品价值…但价值和项目是有价值的。

    试试这个:

    print(sum([sc.items[x]['price']*sc.items[x]['quantity'] for x in sc.items]))