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

如何在Python RPG游戏中实现按唯一物品分组并带数量的格式化库存展示

如何在Python RPG游戏中实现按唯一物品分组并带数量的格式化库存展示

看起来你已经离目标超级近了!你用Counter统计物品数量的思路完全正确,只是差了最后一步——不要遍历原inventory列表,而是直接遍历Counter的键值对,这样每个唯一物品只会输出一次,再配合格式化对齐就能完美实现你想要的效果!

问题出在哪?

你当前的第二个循环是对着原inventory列表遍历的:

for i in inventory:
    print(f"{i.name} \t {inventory_count[i]}")

这就导致同一个物品会被打印多次(比如你的5个草药会输出5行),而我们需要的是每个唯一物品只显示一行。

解决方案:遍历Counter的键值对

Counter的items()方法会返回每个唯一元素和对应的计数,我们直接遍历它就行。另外,为了让名字和数量对齐更整齐,建议用字符串格式化的左对齐语法(比如:<20表示左对齐占20个字符),比\t更可控,避免不同长度的名字导致对齐混乱。

修改后的完整代码

from collections import Counter # This is used to count specific items in inventory.
from collections import namedtuple # I use named tuples for Weapons and Armor.

Weapon = namedtuple('Weapon', ['name','strength','cost']) # Create a named tuple for Weapons
copper_sword = Weapon('Copper Sword',10,180)
# 这里修正了笔误:namedtuple的第一个参数应该和变量名一致,统一为Item
Item = namedtuple('Item', ['name', 'cost']) # Create a named tuple for Items
medicinal_herb = Item('Medicinal Herb', 15)

inventory = [medicinal_herb, medicinal_herb, copper_sword, medicinal_herb, medicinal_herb, medicinal_herb]

print("Inventory:")
# 统计唯一物品数量
inventory_count = Counter(inventory)
# 遍历每个唯一物品及其数量,格式化输出
for item, count in inventory_count.items():
    # 左对齐物品名(占20个字符宽度),后面紧跟数量
    print(f"{item.name:<20}{count}")

输出效果

运行后就会得到你想要的整洁格式:

Inventory:
Medicinal Herb        5
Copper Sword          1

额外小提示

如果你想同时保留原来的“多列平铺展示”(比如给玩家两种查看选项),可以把两种展示逻辑结合起来,比如先展示分组统计,再展示平铺的物品列表,或者让玩家输入指令切换查看方式~

备注:内容来源于stack exchange,提问作者FreyjasChosen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 12:54:33