Итерация в словарях
myLoot = {
"gold": 17,
"ser": 2,
"bronze":1,
"mech": 2
}
lootDragon = ['a','s','d']
def addLoot(inventory, addInventory):
for i in addInventory:
inventory[i] = inventory.get(i, 0) +1
return inventory
print(addLoot(myLoot, lootDragon))
Мы прогоняем i по списку addInventory Затем мне не понятная эта строчка
inventory[i] = inventory.get(i, 0) +1
в плане:
- я понимаю что она ищет похожие ключи, но я не понимаю алгоритм по которому она работает. Для меня код после фора выглядит так после первой итерации
inventory['а'] = inventory.get('а', 0) +1
Объясните пж, я хочу понять это изнутри что бы двигаться дальше
Ответы (1 шт):
inventory[i] = inventory.get(i, 0) + 1
Метод get получает из словаря элемент с ключом i, а если такого нет, то возвращает 0, поскольку он тут указан вторым аргументом (без указания аргумента возвращается None).
Таким образом получается, что если элемента с ключом i в словаре нет, то inventory.get(i, 0) вернёт 0, а если элемент есть, то вернётся текущее значение. Затем к тому, что получено через get добавляется 1. Вот и получается, что если элемент уже был, то он увеличится на 1, а если элемента не было в словаре, то он появится со значением 1. Таким образом организуется счётчик.
Более понятно этот код можно развернуть в такой, полностью аналогичный по логике:
if i in inventory:
inventory[i] += 1
else:
inventory[i] = 1
Просто запись через get получается короче и в одну строку.
P.S. Есть ещё более короткий вариант - с использованием defaultdict:
from collections import defaultdict
myLoot = defaultdict(int, {
"gold": 17,
"ser": 2,
"bronze":1,
"mech": 2
})
lootDragon = ['a','s','d']
def addLoot(inventory, addInventory):
for i in addInventory:
inventory[i] += 1
return inventory
print(dict(addLoot(myLoot, lootDragon)))
В этом варианте вообще не нужно заботиться об инициализации счётчика, defaultdict сам её сделает, использовав значение по умолчанию для переданного ему первым аргументом типа.