Обновление элементов в списке словарей

Я пытаюсь обновить определенный элемент в списке словарей на основе другого значения

У меня есть список словарей

Product_id= [{ "id": 342, "count": 10 },
{"id":  345, "count":  20 },
{"id":  546, "count": 30 },
{"id":  324, "count": 40 },
{"id":  789, "count": 50 },
{"id":  675, "count": 60 }]

Я хотел бы увеличить «количество» x «id», где «id» == x

Например, если «id» == 342, я хочу увеличить количество на 1, чтобы вывод был

print(Product_id)

[{ "id": 342, "count": 11 },
{ "id":  345, "count":  20 },
{ "id":  546, "count": 30 },
{"id":  324, "count": 40 },
{"id":  789, "count": 50 },
{"id":  675, "count": 60 }]

Я могу подсчитать количество, но могу обновить () количество...

Я уже пробовал много вещей, искал стеки и т. д. (И я знаю, что моя последняя попытка была далекой, ниже), поэтому любые идеи будут приветствоваться.

for d in Product_id:
    d.update((k + 1, "count") for k, v in d.items() if v\["id"\] == 342)

Другие указали, как сделать обновление, я просто замечу, что список диктов здесь может быть не оптимальным. Например, могут быть словари с повторяющимися идентификаторами. Почему бы вам не создать единый словарь с ключом id?

Jussi Nurminen 04.04.2022 12:19
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
71
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Мое предложение:

for dic in Product_id:
    if dic["id"] == id:
         dic["count"] += 1

Большое спасибо за вашу помощь! Это именно то, что я искал :) Я знал, что это цикл for, но не знал, как его правильно выполнить!

user18700386 05.04.2022 01:52

Поскольку у вас есть list из dictionaries, вы можете просмотреть каждый dictionary в list. После этого найдите интересующий id(вот он 342). Затем увеличьте count этого словаря на 1.

Вот как вы можете это сделать:

Product_id= [{ "id": 342, "count": 10 },
{"id":  345, "count":  20 },
{"id":  546, "count": 30 },
{"id":  324, "count": 40 },
{"id":  789, "count": 50 },
{"id":  675, "count": 60 }]

x = 342
for item in Product_id:
    if item["id"] == x:
        item["count"] += 1 
        # You can add a break here if there's only one item to update. 

Выход:

[{'id': 342, 'count': 11}, {'id': 345, 'count': 20}, {'id': 546, 'count': 30}, {'id': 324, 'count': 40}, {'id': 789, 'count': 50}, {'id': 675, 'count': 60}]

Это будет работать, хотя я бы добавил перемена после приращения значения пока не, есть возможность большего количества словарей с одним и тем же «идентификатором».

Lancelot du Lac 04.04.2022 12:14
Ответ принят как подходящий

Вам нужно перебрать весь список словарей и проверить элемент, удовлетворяющий вашему условию.

for p in Product_id:
    if p['id'] == 342:
        p['count']+=1
    
print(Product_id)

Большое спасибо за вашу помощь! Это именно то, что я искал :) Я знал, что это цикл for, но не знал, как его правильно выполнить!

user18700386 05.04.2022 01:52

Отвечать:

Здесь есть действительно хороший ответ на ваш вопрос, связанный с pythonic --> Добавить элемент в каждый словарь списка (понимание списка)

Я бы подошел к этому, используя список списков в python как для удобочитаемости, так и для написания успешного/питоновского кода:

В 1 строке:

p_id = [{**dct,**{'count':dct[k]+1}} if dct['id']==342 else dct for dct in Product_id]

Если вам нужна немного более адаптируемая версия для использования в функции и т. д.:

# let x be the value that you want to upate
x = 342
# and k be the key of that value
k = 'count'
p_id = [{**dct,**{k:dct[k]+1}} if dct['id']==x else dct for dct in Product_id]

Объяснение:

  1. Using ifelse statemets in list comprehension to return modified {'key' : 'value'} pair value if condition is true and simply return the dictionary if it flase.
  2. You can't assing variables from within list comp as in value+=1, howevever flattend form (using both if and else) is still less verbose than non list comprehesion form.
  3. **{} merges to dictionaris with right most replacing the key vluee pari of 'count' this is equivalent:
p_id = [dict(dct,**{k:dct[k]+1}) if dct['id']==x else dct for dct in Product_id]

Which will produce the same result and you may prefer. With the left most items where condition is true, if this evaluetes to false then dict if simplyt returned. 4. Star star ** unpacks the dictionary, see --> What does ** (double star/asterisk) and * (star/asterisk) do for parameters? 5. This this in longer form is eqivalent to:

p_id = [{'id':dct['id'],'count':dct['count']+1} if dct['id']==x else dct for dct in Product_id]

6 Rightmost item is the for loop itself and replaces:

for item in itterable:
    if some_condition:
        #do some stuff

Другие вопросы по теме