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

如何实现AlchemicalStorage的get_content函数并生成指定格式的存储概览?

问题描述

我定义了两个类:AlchemicalElement和AlchemicalStorage,其中AlchemicalStorage用于存储AlchemicalElement对象,代码如下:

class AlchemicalElement:

    def __init__(self, name: str):
        self.name = name

    def __repr__(self):
        return f'<AE: {self.name}>'


class AlchemicalStorage:

    def __init__(self):
        self.storage_list = []

我已实现向AlchemicalStorage中添加元素的方法,现在需要实现一个get_content函数,用于返回存储内容的概览字符串。函数要求如下:

def get_content(self) -> str:
    """
    Return a string that gives an overview of the contents of the storage.

    Example:
        storage = AlchemicalStorage()
        storage.add(AlchemicalElement('Fire'))
        storage.add(AlchemicalElement('Water'))
        storage.add(AlchemicalElement('Water'))
        print(storage.get_content())

    Output:
        Content:
         * Fire x 1
         * Water x 2

    The elements must be sorted alphabetically by name.
    """

我目前写出了部分代码:

count = {}
    for e in self.storage_list:
        if e not in count:
            count[e] = 1
        else:
            count[e] += 1

原本想用字典统计元素数量,但字典的键显示的是__repr__方法生成的<AE: 元素名>,而非单纯的元素名称。请问如何去掉<AE: >前缀?或者有没有更简便的方式实现该函数?同时希望能给出完整的实现示例。

解决方案

问题出在你用AlchemicalElement对象当字典键了——每个元素实例都是独立的对象,哪怕名字一样,也会被当成不同的键。而且你看到的<AE: 元素名>是对象__repr__的输出,根本没必要去“去掉前缀”,直接用元素的name属性当统计键就好。

方式一:手动用字典统计

直接遍历存储列表,以元素的name为键计数,之后按名称排序,再拼接成要求的字符串:

class AlchemicalElement:
    def __init__(self, name: str):
        self.name = name

    def __repr__(self):
        return f'<AE: {self.name}>'


class AlchemicalStorage:
    def __init__(self):
        self.storage_list = []

    def add(self, element: AlchemicalElement):
        self.storage_list.append(element)

    def get_content(self) -> str:
        count = {}
        # 统计每个元素名称的数量
        for e in self.storage_list:
            if e.name not in count:
                count[e.name] = 1
            else:
                count[e.name] += 1
        
        # 按元素名称字母顺序排序
        sorted_elements = sorted(count.items())
        
        # 构建结果字符串
        result_lines = ["Content:"]
        for name, num in sorted_elements:
            result_lines.append(f" * {name} x {num}")
        
        return '\n'.join(result_lines)

方式二:用collections.Counter简化统计

Python标准库的collections.Counter可以直接帮你完成计数工作,代码更简洁:

from collections import Counter

class AlchemicalElement:
    def __init__(self, name: str):
        self.name = name

    def __repr__(self):
        return f'<AE: {self.name}>'


class AlchemicalStorage:
    def __init__(self):
        self.storage_list = []

    def add(self, element: AlchemicalElement):
        self.storage_list.append(element)

    def get_content(self) -> str:
        # 提取所有元素的name,用Counter计数
        element_counts = Counter(e.name for e in self.storage_list)
        
        # 按名称排序
        sorted_elements = sorted(element_counts.items())
        
        # 构建输出字符串
        output = ["Content:"]
        for name, count in sorted_elements:
            output.append(f" * {name} x {count}")
        
        return '\n'.join(output)

测试验证

运行示例代码:

storage = AlchemicalStorage()
storage.add(AlchemicalElement('Fire'))
storage.add(AlchemicalElement('Water'))
storage.add(AlchemicalElement('Water'))
print(storage.get_content())

输出结果完全符合要求:

Content:
 * Fire x 1
 * Water x 2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:30:51