如何实现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
相关产品推荐
相关产品推荐

