Как изменить значения словаря из списка словарей - PullRequest
2 голосов
/ 20 мая 2019

Я объявляю метод с именем add_to_cart (дБ, itemid, количество). Каждый раз, когда метод вызывается, он будет искать в базе данных данные сеанса. Данные сессий содержат список словарей. Цель этого метода - создать новую запись (словарь) в списке или обновить значение существующей записи. Словарь имеет следующие ключи: id, количество

До сих пор я разработал следующий код. Прежде всего после извлечения данных из базы данных я сопоставляю itemid с ключом словаря: 'id'. Если itemid не совпадает ни с одним из значений словарей, он добавит новый словарь в этот список.

def add_to_cart(db, itemid, quantity):
    # ......
    row = cursor.fetchone()
    if row is not None:
        cart = json.loads(row['data'])
        for dic in cart:
            if str(dic.get("id")) == str(itemid):
                dic['quantity'] = int(dic['quantity']) + quantity
                data = json.dumps(cart)
                # update the 'data' to the database
                break
     else:
         if counter == len(cart):
              item = {
                      'id': itemid,
                      'quantity': quantity
                     }
              cart.append(item)
              data = json.dumps(cart)  
              # update the 'data' to the database
              break

Пусть начальная корзина выглядит так:

[{'id': '40', 'amount': '2'}, {'id': '41', 'amount': '5'}]

Когда я добавляю еще 1 предмет 40 в корзину, это должно выглядеть примерно так:

[{'id': '40', 'amount': '3'}, {'id': '41', 'amount': '5'}]

но я получаю:

[{'id': '40', 'amount': '2'}, {'id': '41', 'amount': '5'}, {'id': '40', ' количество ':' 1 '}]

Ответы [ 2 ]

1 голос
/ 20 мая 2019

Вы добавляете новый словарь в список, когда делаете cart.append(item), отсюда и список
[{'id': '40', 'quantity': '2'}, {'id': '41', 'quantity': '5'}]

в итоге становится

[{'id': '40', 'quantity': '2'}, {'id': '41', 'quantity': '5'}, {'id': '40', 'quantity': '1'}]

Но вы хотите найти соответствующий идентификатор в этом списке словарей и добавить к количеству для этого словаря.

Таким образом, код будет выглядеть следующим образом:

li = [{'id': '40', 'quantity': '2'}, {'id': '41', 'quantity': '5'}]

def add_elem(li, id, to_add):

    #Iterate over the dictionaries
    for item in li:
        #If the id is found
        if str(id) in item.values():
            #Increment the quantity
            item['quantity'] = str(int(item['quantity']) + to_add)

    #Return the updated list
    return li

print(add_elem(li, 40, 1))

Выход будет

[{'id': '40', 'quantity': '3'}, {'id': '41', 'quantity': '5'}]
0 голосов
/ 20 мая 2019

Кажется, проблема в том, что вы просто добавляете новый dict в список (корзину) через append. Вам нужно пройти по списку, найти диктовку с itemid, которая вам нужна, затем добавить к quantity.

Попробуйте это -

for dict in cart:
     if dict[itemid] == itemid:
        dict['quantity'] += str(quantity)
        break

item = {
        'id': itemid,
        'quantity': quantity
       }
cart.append(item)
...