如何迭代多个字典键列表(值)对

How to iterate over multiple dictionary key list(value) pairs

所以,我正在尝试创建一个游戏。在此游戏机制中,用户尝试使用字典中的项目。

inventory = {
"Health": ["Potion", "Hi-Potion","Elixer"],
"Weapons": ["Blade","Dagger","Staff"],
"Items": ["Glass", "Paper","Notes"],
"Components": ["Rusty Trombone"],
}

# Add and Use item

def add_to_inventory(item_type, item_name):
    inventory[item_type].append(item_name)

def use_item():
    for item_type, item_name in inventory.items():
        print(item_type.title(),":",item_name)
    use_item = input("What will you use? \n").title()
    if use_item in inventory["Health"]:
        position = inventory["Health"].index(use_item)
        print(f"You've used {use_item}. {use_item} will now be discarded.")
        return inventory["Health"].pop(position)
    elif use_item in inventory["Weapons"]:
        position = inventory["Weapons"].index(use_item)
        print(f"You've used {use_item}. {use_item} will now be discarded.")
        return inventory["Weapons"].pop(position)
    elif use_item in inventory["Items"]:
        position = inventory["Items"].index(use_item)
        print(f"You've used {use_item}. {use_item} will now be discarded.")
        return inventory["Items"].pop(position)
    elif use_item in inventory["Components"]:
        position = inventory["Compoents"].index(use_item)
        print(f"You've used {use_item}. {use_item} will now be discarded.")
        return inventory["Components"].pop(position)

use_item()

有很多冗余,但我找不到如何缩短我的代码。

使用 use_item 功能,我想首先让用户查看整个库存,以便更轻松地选择要使用的内容。然后是使用物品的提示。 我想保留所有字符串的 title 方法,以防将来多个单词项目需要将首字母大写。 使用位置变量可以让我获得正在使用的项目的索引位置。这使我可以使用 pop 方法不仅从库存中丢弃物品,而且 return 该物品用于其预期用途(开门的钥匙,使用武器,恢复健康,修补)。

所有的机制都还没有编码,但我越看这部分就越觉得它可以做得更好。我不知道该怎么做。

我正在考虑遍历每个键值对,然后从字典中丢弃该项目。但是,我需要 pop 方法 return 有问题的项目(并结束该功能)。我 运行 因具有列表值的键而陷入困境。作为列表的值使其更容易浏览,但也提出了需要进一步迭代的问题——可能使用嵌套的 for 循环?但是后来我不确定如何实现它以适应这种情况。

由于您对字典中的每个键执行相同的操作,因此您可以改用 for 循环:

for key in inventory:
    if use_item in inventory[key]:
        position = inventory[key].index(use_item)
        print(f"You've used {use_item}. {use_item} will now be discarded.")
        return inventory[key].pop(position)
  • 由于您多次重复相同的操作,您可以将其移动到 for 循环中的函数。

  • .remove() 用一种方法 indexpop

def discard(user_item, inventory):
    for k, v in inventory.items():
        if user_item in v:
            print(
                f"You've used {user_item}. {user_item} will now be discarded.")
            inventory[k].remove(user_item)
            return user_item


def use_item():

    for item_type, item_name in inventory.items():
        # Join will join elements nicely
        # Use an f string to easily edit string format
        print(f"{item_type.title()}: {', '.join(item_name)}")

    # Try not to name variables after your function name
    user_item = input("What will you use? \n").title()

    discard(user_item, inventory)

其他建议已在

中评论