如何在python字典中按值附加现有键?

时间:2015-09-15 19:39:28

标签: python flask

我试图根据Flask上的会话创建购物车。

想法很简单:

  1. 客户点击"加入购物车"隐藏输入product_idqty
  2. 的按钮
  3. 此POST查询在会话中添加新记录[" cart"]词典

    [{'qty': '1', 'product_id': '6'}, 
    {'qty': '1', 'product_id': '6'},
    {'qty': '1', 'product_id': '6'}]
    
  4. 我抓住这些字段并将它们添加到会话字典中:

    session["cart"].append(dict({'product_id': id, 'qty': qty}))
    
  5. 每次有人在购物车中添加产品时,都会在购物车会话中添加新记录{'product_id': id, 'qty': qty}

    如何检查这个product_id是否已经在字典中,如果是,只增加qty,但不要在字典中创建具有相同product_id的新记录?

    我的添加到购物车

    @app.route('/add-to-cart', methods=['GET', 'POST'])
    def add_to_cart():
        if request.method == 'POST':
            id = int(request.form['product_id'])
            qty = int(request.form['qty'])
    
            cart_session()
    
            matching = [d for d in session['cart'] if d['product_id'] == id]
            if matching:
                matching[0]['qty'] += qty
    
            session["cart"].append(dict({'product_id': id, 'qty': qty}))
    
            return redirect(url_for('home'))
    

    解决方案

    @app.route('/add-to-cart', methods=['GET', 'POST'])
    def add_to_cart():
        if request.method == 'POST':
            id = int(request.form['product_id'])
            qty = int(request.form['qty'])
    
            cart_session()
    
            matching = [d for d in session['cart'] if d['product_id'] == id]
            if matching:
                matching[0]['qty'] += qty
            else:
                session["cart"].append(dict({'product_id': id, 'qty': qty}))
    
            return redirect(url_for('home'))
    

2 个答案:

答案 0 :(得分:3)

在python中查找列表中对象的一种简单方法是使用list comprehension:

matching = [d for d in session['cart'] if d['product_id'] == id]
if matching:
    matching[0]['qty'] += int(qty)
else:
    session['cart'].append(dict({'product_id': id, 'qty': int(qty)}))

答案 1 :(得分:3)

rlbondhas already suggested一样,请使用defaultdict,如下所示:

cart = defaultdict(int)
for product_id, qty in d.iteritems():
    cart[product_id] += qty

因此,在这种情况下,如果product_id dict中尚未存在某个键cart的条目,则会自动初始化为0并递增。