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

Python文本冒险游戏开发:如何从嵌套库存字典提取统一属性?

嘿,我之前在做文本冒险游戏的库存系统时也遇到过类似需求,给你几个实用的实现方案,适配你说的嵌套字典结构!

先假设你的库存字典大概是这样的(方便示例):

# 示例库存结构
inventory = {
    "healing_potion": {
        "objectnames": ["治疗药水", "红色药剂"],
        "description": "饮用后恢复30点生命值",
        "weight": 0.5
    },
    "iron_sword": {
        "objectnames": ["铁剑", "生锈的长剑"],
        "description": "一把普通的近战武器,伤害中等",
        "damage": 15
    },
    "torch": {
        "objectnames": ["火把", "燃烧的木棍"],
        "description": "照亮黑暗区域,持续10分钟",
        "duration": 600
    }
}
解决方案

方法1:基础循环遍历(直观易懂)

这是最直白的写法,适合刚接触字典遍历的场景,逻辑清晰:

def list_objectnames(inventory):
    object_names = []
    # 遍历库存里的每个物品子字典
    for item in inventory.values():
        # 提取每个物品的objectnames属性,添加到列表中
        object_names.extend(item["objectnames"])
    return object_names

# 调用示例
print(list_objectnames(inventory))
# 输出: ['治疗药水', '红色药剂', '铁剑', '生锈的长剑', '火把', '燃烧的木棍']

如果每个物品的objectnames是单个字符串(不是列表),把extend改成append就行。

方法2:列表推导式(简洁Pythonic写法)

如果你喜欢更紧凑的代码,列表推导式是Python里的常用技巧,一行就能搞定:

def list_objectnames(inventory):
    return [name for item in inventory.values() for name in item["objectnames"]]

# 调用效果和方法1完全一致
print(list_objectnames(inventory))

这种写法更符合Python风格,适合已经熟悉列表推导式的开发者。

方法3:带异常处理的健壮版本

考虑到后续扩展时可能出现某个物品没有objectnames字段的情况,加上异常处理能避免程序崩溃:

def list_objectnames(inventory):
    object_names = []
    for item in inventory.values():
        try:
            object_names.extend(item["objectnames"])
        except KeyError:
            # 可以选择跳过该物品,或者打印警告日志
            print(f"警告:某个物品缺少objectnames字段,已跳过")
    return object_names

这个版本容错性更强,适合长期维护的项目。

另外,如果你只需要每个物品的objectnames的第一个名称(比如主名称),只需要把extend(item["objectnames"])改成append(item["objectnames"][0])就行,灵活调整很方便!

内容的提问来源于stack exchange,提问作者sporkwizard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:47:48