如何将列表项添加到词典?

2024-06-16 11:10:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我想写一个名为addToInventory(inventory, addedItems)的函数,其中 库存参数是代表玩家库存“物品”的字典,addedItems参数是类似dragonLoot的列表

该函数应将列表中的项目添加到玩家库存中

stuff = {'rope':1, 'torch':6, 'gold coins':42, 'dagger':1, 'arrow':12}

dragonLoot = ['gold coins', 'dagger', 'gold coins', 'gold coins', 'ruby']

def addToInventory(inventory, addedItems):
    for n in range(0, len(addedItems)):
        new_inv = inventory.copy()
        for k, v in (new_inv.items()):
            if k == addedItems[n]:
                v += 1
            else:
                new_inv[str(addedItems[n])] = 1

def displayInventory(inventory):
    print("Inventory:")
    item_total = 0
    for key, value in inventory.items():
        print(str(value) + ' ' + key)
        item_total += v
    print("Total number of itmes: " + str(item_total))

stuff = addToInventory(stuff, dragonLoot)
displayInventory(stuff)

但这个节目:

Traceback (most recent call last):
  File "C:/Users/admin/AppData/Local/Programs/Python/Python38/Automate the boring stuff with python/testdict.py", line 21, in <module>
    stuff = addToInventory(stuff, dragonLoot)
  File "C:/Users/admin/AppData/Local/Programs/Python/Python38/Automate the boring stuff with python/testdict.py", line 8, in addToInventory
    for k, v in (new_inv.items()):
RuntimeError: dictionary changed size during iteration

附言:我是编程新手,所以有人也可以详细解释我遗漏了什么或哪里错了。谢谢


Tags: innewfor库存itemsinventoryprintstuff
3条回答

不使用collections的替代解决方案:

stuff = {'rope':1, 'torch':6, 'gold coins':42, 'dagger':1, 'arrow':12}
dragon_loot = ['gold coins', 'dagger', 'gold coins', 'gold coins', 'ruby']

def add_to_inventory(inventory, added_items):
    inventory_keys = inventory.keys()
    for i in added_items:
        if i in inventory_keys:
            inventory[i] +=1
        else:
            inventory[i] = 1
    return inventory

add_to_inventory(stuff, dragon_loot)

也许是最简单的解决方案,但它是有效的:

def addToInventory(inventory, added_items):
    for i in added_items:
        if i not in inventory:
            inventory.setdefault(i, 1)
        else:
            inventory[i] += 1
   
    return inventory

您可以使用collections.Counter来保持stuff

from collections import Counter

stuff = Counter({'rope':1, 'torch':6, 'gold coins':42, 'dagger':1, 'arrow':12})
dragonLoot = ['gold coins', 'dagger', 'gold coins', 'gold coins', 'ruby']

def addToInventory(inventory, addedItems):
    return inventory + Counter(dragonLoot)

stuff = addToInventory(stuff, dragonLoot)
print(stuff)

输出:

Counter({'rope': 1,
         'torch': 6,
         'gold coins': 45,
         'dagger': 2,
         'arrow': 12,
         'ruby': 1})

如果不想使用collections.Counter模块,可以使用:

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

    return inventory

stuff = addToInventory(stuff, dragonLoot)

输出:

{'rope': 1, 'torch': 6, 'gold coins': 45, 'dagger': 2, 'arrow': 12, 'ruby': 1}

相关问题 更多 >