将两个词典与具有相同键的项一起添加

时间:2018-01-23 05:26:42

标签: python dictionary

我的功能是添加以下项目的两个词典(' item_name':项目数量)。有一个错误,我修复了它,但我不明白它是如何工作的。

这是我的原始代码,它无法正常工作。

inventory = {'rope': 1, 'torch': 5, 'gold': 3000, 'dagger': 1}
loot = {'lock pick': 3, 'potion' : 1, 'lock pick': 4, 'potion' : 1, 'sword': 1}

def addToInventory(inventory, addedItems):
  for item, quantity in addedItems.items():
    inventory.setdefault(item, 0)
    inventory[item] += quantity

addToInventory(inventory, loot)

当战利品中有相同的物品时,它不会将其中一个数量添加到库存中。

以下是有效的代码:

def addToInventory(inventory, addedItems):
  for item, quantity in addedItems.items():
    inventory.setdefault(item, quantity)
    inventory[item] += quantity

addToInventory(inventory, loot)

为什么没有" invertory.setdefault(item,quantity)"重新计算它必须设置默认值的第一项?

3 个答案:

答案 0 :(得分:2)

您的loot词典有重复的键。因此,实际上只有其中一个会被添加到字典中。您应该使用元组列表或类似的东西。

inventory = {'rope': 1, 'torch': 5, 'gold': 3000, 'dagger': 1}
loot = [('lock pick', 3), ('potion', 1), ('lock pick', 4), ('potion', 1),
        ('sword', 1)]


def addToInventory(inventory, addedItems):
    for item, quantity in addedItems:
        # This will get the existing value and add quantity to it. If the key
        # does not exist, `inventory.get` will use zero
        inventory[item] = inventory.get(item, 0) + quantity


addToInventory(inventory, loot)
print(inventory)

<强>输出

{'dagger': 1,
 'gold': 3000,
 'lock pick': 7,
 'potion': 2,
 'rope': 1,
 'sword': 1,
 'torch': 5}

答案 1 :(得分:1)

这一行:

loot = {'lock pick': 3, 'potion' : 1, 'lock pick': 4, 'potion' : 1, 'sword': 1}

没有按照您的预期进行,lock pick的第二个实例会覆盖第一个实例。由于loot是一个字典,因此每个键只能有一个实例。如果要允许多种类型的战利品实例,请考虑元组列表:

loot = [('lock pick', 3), ('potion', 1), ('lock pick', 4)]

然后你的功能看起来几乎一样:

def addToInventory(inventory, addedItems):
    for item, quantity in addedItems:
        inventory.setdefault(item, 0)
        inventory[item] += quantity       

答案 2 :(得分:0)

字典只能为字典中的每个键分配一个值。看起来Python的行为是使用您为每个键提供的后一个值。

>>> loot = {'lock pick': 3, 'potion' : 1, 'lock pick': 4, 'potion' : 1, 'sword': 1}
>>> print(loot)
{'lock pick': 4, 'potion': 1, 'sword': 1}
>>>