Удалить значение из элемента словаря в списке

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

bandits = [{'health': 15, 'damage': 2, 'id': 0}, {'health': 10, 'damage': 2, 'id': 0}, {'health': 12, 'damage': 2, 'id': 0}]
hero = [{'name': "Arthur", 'health': 50, 'damage': 5, 'id': 0}]

Что я хотел бы сделать, так это имитировать удар hero для каждого члена списка bandits, который состоит в вычитании значения damage hero из значения health каждой записи bandits. В качестве иллюстрации, со значениями, приведенными выше, после того, как hero нанесет свой удар, список bandits должен выглядеть следующим образом:

bandits = [{'health': 10, 'damage': 2, 'id': 0}, {'health': 5, 'damage': 2, 'id': 0}, {'health': 7, 'damage': 2, 'id': 0}]

Я пробовал несколько вещей, среди которых

for i, v in enumerate(bandits):
    bandits[i] = {k: (bandits[i][k] - hero[0].get('damage')) for k in bandits[i] if k=='health'}

Который дает

bandits = [{'health': 10}, {'health': 5}, {'health': 7}]

Т. е. результаты по здоровью хорошие, но все остальные key:val пары в словарях, содержащихся в bandits списке, удаляются. Как я могу исправить свой код?

Не заменяйте весь словарь, обновляйте только значение для одного ключа.

mkrieger1 16.02.2023 21:17

Не пишите все в одну строчку, сами себя запутаете. Используйте шаблон: (1) получить текущее значение из словаря (2) вычислить новое значение из текущего значения (3) вставить новое значение в словарь. Это должно быть не менее 3 утверждений.

mkrieger1 16.02.2023 21:20
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Отказ от ответственности: Эта статья предназначена только для демонстрации и не должна использоваться в качестве инвестиционного совета.
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
Потяните за рычаг выброса энергососущих проектов
Потяните за рычаг выброса энергососущих проектов
На этой неделе моя команда отменила проект, над которым я работал. Неделя усилий пошла насмарку.
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
1
2
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Не создавайте новые словари, просто вычтите из значений в существующих словарях.

for bandit in bandits:
    bandit['health'] -= hero[0]['damage']

Ваш код похож на предыдущий ответ, поэтому он помогает. Спасибо.

aheuchamps 17.02.2023 10:47
Ответ принят как подходящий

В зависимости от целей/варианта использования вы можете перебирать коллекцию и обновлять значение на месте (имена переменных используются из кода «Я пробовал несколько вещей»):

bandit = [{'health': 15, 'damage': 2, 'id': 0}, {'health': 10, 'damage': 2, 'id': 0}, {'health': 12, 'damage': 2, 'id': 0}]
knight_data = [{'name': "Arthur", 'health': 50, 'damage': 5, 'id': 0}]

for b in bandit:
    for k in knight_data:
        b['health'] -= k['damage']

Или:

for b in bandit:
    b['health'] -= knight_data[0]['damage']

@KellyBundy 1) спасибо, обновлено, 2) проверьте «Я пробовал несколько вещей, среди которых» OP-код. hero не используется.

Guru Stron 16.02.2023 21:26

Ах, эта строка слишком длинная, чтобы поместиться на моем экране :-)

Kelly Bundy 16.02.2023 21:28

Тем не менее, я бы выбрал имя, указанное первым и чаще (и короче).

Kelly Bundy 16.02.2023 21:30

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