Итерация в словарях
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
сам её сделает, использовав значение по умолчанию для переданного ему первым аргументом типа.