You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以列表为字典键实现灵活匹配的物品拾取功能?

游戏物品拾取功能解决方案

核心思路调整

Python字典的键必须是可哈希类型(如字符串、数字),而列表是可变类型、不可哈希,所以不能直接用列表作为字典键。正确的做法是:

  • 把每个物品的所有别名单独作为字典的键
  • 所有别名都指向同一个物品对象(封装了描述、重量等属性)
    这样玩家输入任何别名,都能快速匹配到对应的物品。

完整代码实现

1. 定义物品类(封装属性)

class Item:
    def __init__(self, formal_name, description, weight):
        self.formal_name = formal_name  # 物品正式名称
        self.description = description  # 物品描述
        self.weight = weight            # 物品重量

2. 创建物品实例与别名映射

# 实例化具体物品
apple = Item("苹果", "刚从树上摘下来的红苹果,汁水充足", 0.2)
bread = Item("面包", "全麦制作的硬面包,能扛饿一整天", 0.5)

# 别名映射字典:每个别名对应一个物品实例
item_aliases = {
    "苹果": apple,
    "红苹果": apple,
    "apple": apple,
    "面包": bread,
    "全麦面包": bread,
    "干粮": bread
}

3. 拾取功能实现

def pick_item(player_input, inventory):
    # 把输入转成小写,避免大小写匹配问题
    input_clean = player_input.strip().lower()
    # 遍历别名字典,忽略大小写匹配
    for alias, item in item_aliases.items():
        if alias.lower() == input_clean:
            inventory.append(item)
            print(f"你拾取了【{item.formal_name}】")
            return
    print("这里没有这个物品!")

4. 库存展示功能

def show_inventory(inventory):
    if not inventory:
        print("你的背包是空的")
        return
    print("=== 你的背包 ===")
    for idx, item in enumerate(inventory, 1):
        print(f"{idx}. {item.formal_name}")
        print(f"   描述:{item.description}")
        print(f"   重量:{item.weight}kg\n")

5. 交互示例

# 初始化玩家库存
player_inventory = []

# 模拟玩家输入
pick_item("红苹果", player_inventory)
pick_item("干粮", player_inventory)
show_inventory(player_inventory)

运行结果:

你拾取了【苹果】
你拾取了【面包】
=== 你的背包 ===
1. 苹果
   描述:刚从树上摘下来的红苹果,汁水充足
   重量:0.2kg

2. 面包
   描述:全麦制作的硬面包,能扛饿一整天
   重量:0.5kg

原理说明

  1. 哈希与字典键的限制:字典通过哈希值快速定位键,只有不可变对象(字符串、数字、元组等)能保证哈希值稳定,列表是可变对象,哈希值会随内容变化,因此不能作为字典键。
  2. 物品类的作用:用类把物品的属性(名称、描述、重量)封装在一起,避免用零散的变量存储,方便统一调用和扩展(比如后续添加价值、耐久度等属性)。
  3. 别名映射的效率:每个别名直接指向物品实例,查找时间复杂度为O(1),比遍历列表匹配的效率高很多,适合游戏中频繁的物品交互场景。

内容的提问来源于stack exchange,提问作者Audrey Sims-Hunt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 02:03:13