Итерация в словарях

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

в плане:

  1. я понимаю что она ищет похожие ключи, но я не понимаю алгоритм по которому она работает. Для меня код после фора выглядит так после первой итерации
inventory['а'] = inventory.get('а', 0) +1

Объясните пж, я хочу понять это изнутри что бы двигаться дальше


Ответы (1 шт):

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

→ Ссылка