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
相关产品推荐
相关产品推荐

