У меня есть два списка словарей, а именно
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 списке, удаляются. Как я могу исправить свой код?
Не пишите все в одну строчку, сами себя запутаете. Используйте шаблон: (1) получить текущее значение из словаря (2) вычислить новое значение из текущего значения (3) вставить новое значение в словарь. Это должно быть не менее 3 утверждений.
Не создавайте новые словари, просто вычтите из значений в существующих словарях.
for bandit in bandits:
bandit['health'] -= hero[0]['damage']
Ваш код похож на предыдущий ответ, поэтому он помогает. Спасибо.
В зависимости от целей/варианта использования вы можете перебирать коллекцию и обновлять значение на месте (имена переменных используются из кода «Я пробовал несколько вещей»):
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 не используется.
Ах, эта строка слишком длинная, чтобы поместиться на моем экране :-)
Тем не менее, я бы выбрал имя, указанное первым и чаще (и короче).
Не заменяйте весь словарь, обновляйте только значение для одного ключа.