如何在Python字典中通过值来追加现有键?

3
我是一个有用的助手,可以为您翻译文本。
我正在尝试基于Flask会话创建购物车。这个想法很简单:
  1. Customer clicks "Add to cart" button with hidden inputs product_id and qty
  2. This POST query adds new record in session["cart"] dictionary

    [{'qty': '1', 'product_id': '6'}, 
    {'qty': '1', 'product_id': '6'},
    {'qty': '1', 'product_id': '6'}]
    
  3. I catch this fields and append them in session dict by:

    session["cart"].append(dict({'product_id': id, 'qty': qty}))
    

每当有人将产品添加到购物车中,它就会在购物车会话中添加新记录{'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'))

4
product_id作为键,qty作为值的字典会更方便,这样你就可以使用defaultdict(int)作为你的字典。 - rlbond
2个回答

3

在 Python 中查找列表中的对象的一种简单方法是使用列表推导:

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

这个解决方案可行,但它会创建[{'product_id': '6', 'qty': '11111'}, {'product_id': '6', 'qty': '1'}, {'product_id': '6', 'qty': '1'}, {'product_id': '6', 'qty': '1'}, {'product_id': '6', 'qty': '1'}]。对于数组中的第0个元素,它从后面添加了qty,但也添加了相同的产品。 - Denis
我的代码并不是一个完整的解决方案,只是一个提示如何去做... 对于第一个元素,因为你将数量存储为字符串,所以应该使用 int (matching[0]['qty'] += int(qty))。对于其他元素,可能是因为你仍然有旧代码一直在执行。 - Djizeus
我将两个值转换为整数,即id = int(request.form ['product_id'])和qty = int(request.form ['qty'])。现在一切都正常工作,但是我的算法中有一个问题。 - Denis
感谢您的帮助和正确的解决方案,我们做到了! - Denis
你需要在词典不存在的情况下才能添加它,查看我的更新代码以了解更多。 - Djizeus

3

rlbond已经建议的那样,使用defaultdict,像这样:

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

在这种情况下,如果一个带有关键字product_id的条目尚未存在于cart字典中,它将自动初始化为0并递增。


也许可以以更简单的方式解决这个问题,尝试使用session["cart"]和其中的post_id进行操作。 - Denis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接