代码之家  ›  专栏  ›  技术社区  ›  Digimartyr

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

  •  1
  • Digimartyr  · 技术社区  · 2 年前

    所以,我想创造一个游戏。在这个游戏机制中,用户试图使用字典中的一项。

    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方法。 使用position变量可以获得所用项目的索引位置。这使我能够使用pop方法,不仅从库存中丢弃物品,还可以将该物品退回其预期用途(打开门的钥匙、使用武器、恢复健康、修补)。

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

    我在考虑遍历每个键值对,然后从字典中丢弃该项。但是,我需要pop方法来返回有问题的项(并结束函数)。我遇到了麻烦,因为键有一个列表值。作为一个列表的值使其更容易浏览,但也存在需要进一步迭代的问题——可能是使用嵌套的for循环?但我不知道如何实现这一点来应对这种情况。

    2 回复  |  直到 2 年前
        1
  •  1
  •   BrokenBenchmark Miles Budnek    2 年前

    由于对字典中的每个键都执行相同的操作,因此可以使用 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)
    
        2
  •  1
  •   Freddy Mcloughlan    2 年前
    • 当您多次重复同一操作时,可以将其移动到 for

    • .remove() 是吗 index pop 有一种方法

    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)
    

    其他的建议已经在文章中发表了评论