Python - сравнение словарей - PullRequest
       4

Python - сравнение словарей

0 голосов
/ 09 февраля 2019

У меня проблема в python со сравнением словаря.У меня есть 2 словаря, и я хочу сравнить их, и когда ключ совпадает, значение обновляется до valueFromFirstDictionary + valueFromSecondDictionary.

Функция 'addToInventory ()' должна иметь 45 монет вместо 3, но в чем проблема?В цикле он печатает 45, но когда я печатаю все словари, он показывает 3.

Вот проблема с функцией:

def addToInventory(inventory, addedItems):
    dictionaryHelp = {}

    for i in addedItems:                                 
        dictionaryHelp.setdefault(i,0)
        dictionaryHelp[i] = dictionaryHelp[i] + 1

    for i, k in inventory.copy().items():
        for j, l in dictionaryHelp.items():
            #print(i, k, j, l)
            if i == j:
                suma = k + l
                inventory.update({i:suma})
                #inventory[i] = suma
                print(inventory[i])
                break
            else:
                inventory[j] = l

    print(inventory)
    return(inventory)

inv = {'golden coin': 42, 'rope': 1}
dragonLoot = ['golden coin', 'dagger','golden coin', 'golden coin', 'ruby']
inv = addToInventory(inv, dragonLoot)

for k, v in inv.items():
    print(str(k) + ': ' + str(v))
    item_total = item_total + v

Код также доступен на Pastebin.

1 Ответ

0 голосов
/ 09 февраля 2019

В вашем цикле for внимательно посмотрите на else stuite, где вы используете j:

for i, k in inventory.copy().items():
    for j, l in dictionaryHelp.items():
        if i == j:
            # ...
        else:
            inventory[j] = l

Вы перебираете клавиши для inventory() и для каждый ключ вы зацикливаетесь на dictionaryHelp.items().И каждый раз, когда значение i == j равно , а не , вы устанавливаете inventory[j] = l.Неважно, что вы установили 'golden coin' на 45 на некоторую точку , вы просто заменили этот результат.

Однако вам не нужно использовать двойной цикл.Словари отлично при тестировании, если заданный ключ уже есть, просто используйте key in dictionary;это правда, если вы можете получить значение для этого ключа из этого словаря.

Это означает, что вам не нужно зацикливаться на обоих словарях, просто используйте ключ из одного, чтобы увидеть, есть ли номер для элемента в другом:

for item, count in dictionaryHelp.items():
    if item in inventory:
        inventory[item] = inventory[item] + count
    else:
        inventory[item] = count
  • Больше нет необходимости копировать inventory, потому что вы не зацикливаетесь на этом сейчас.
  • Вместо проверки на item in inventory, вы можете использовать dict.get()вместо этого используется значение по умолчанию 0:

    for item, count in dictionaryHelp.items():
        inventory[item] = inventory.get(item, 0) + count
    

    dict.get() аналогично использованию dict.setdefault(), но без установки значения ключа в словаре по умолчанию.

  • Вам не нужно создавать dictionaryHelp.Просто добавьте количество непосредственно в ваш inventory словарь.Я использую тот же трюк dict.get(), чтобы начать с 0, если в инвентаре еще не было добавленного предмета:

    def addToInventory(inventory, addedItems):
        for item in addedItems:
            inventory[item] = inventory.get(item, 0) + 1
        return inventory
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...