Python优化方法输入校验:复用列表存在性检查逻辑的更佳方案
优化方案与实现建议
首先,你的代码里维护mapDict(索引到Product)和mapVal(商品名列表)两个结构是冗余的,而且列表的in操作是O(n)时间复杂度,换成以商品名为键的字典存储Product对象,不仅能把存在性检查降到O(1),还能省去维护两个结构的麻烦,这是最核心的优化点。
针对你想复用存在性检查逻辑的需求,建议把检查逻辑拆成两个更清晰的方法,分别对应不同场景:
- 一个方法返回布尔值,用于
add_item这种需要判断“是否不存在”的场景 - 另一个方法在商品不存在时抛出异常,用于
update_name/remove_item这种要求商品必须存在的场景
优化后的代码如下:
from dataclasses import dataclass @dataclass class Product: name: str quantity: int price: float class Transaction: def __init__(self): # 直接用商品名作为键存储Product对象,无需额外维护列表 self.products = {} def _item_exists(self, name): # 内部辅助方法:返回商品是否存在的布尔值 return name in self.products def require_item_exists(self, name): # 对外方法:商品不存在则抛出异常,供update/remove等方法调用 if not self._item_exists(name): raise ValueError(f"商品 '{name}' 不存在,请先添加") def add_item(self, name, quantity, price): # 复用_item_exists的逻辑判断是否可添加 if not self._item_exists(name): self.products[name] = Product(name, quantity, price) return True return False # 举个复用require_item_exists的例子: def remove_item(self, name): self.require_item_exists(name) del self.products[name] def update_quantity(self, name, new_quantity): self.require_item_exists(name) self.products[name].quantity = new_quantity
优化点说明:
- 存储结构简化:用
self.products字典替代原有的两个结构,既减少了代码维护成本,又提升了存在性检查的效率。 - 逻辑复用清晰:
_item_exists作为内部辅助方法,封装最基础的存在性判断逻辑,供内部方法调用require_item_exists封装“必须存在”的校验逻辑,抛出更明确的ValueError(比通用的Exception更规范),供update/remove等方法复用
- 方法职责单一:每个方法只做一件事,
add_item专注添加逻辑,检查逻辑复用辅助方法,代码更易读易维护。
另外,如果你坚持要保留原有的存储结构(比如有特殊业务需求),那也可以调整check_if_not_exists的设计,让它返回布尔值而不是抛出异常,这样add_item可以直接复用:
# 保留原结构的情况下调整check方法 def check_if_not_exists(self, name): return name not in self.mapVal # add_item中复用 def add_item(self, name, quantity, price): if self.check_if_not_exists(name): self.mapDict[len(self.mapVal)] = Product(name, quantity, price) self.mapVal.append(name) return True return False # 而update/remove等方法可以单独写一个检查存在的方法: def check_if_exists(self, name): if name not in self.mapVal: raise Exception("Name does not exist.")
但这种方式依然存在原结构的冗余和效率问题,还是推荐第一种字典存储的方案。
内容的提问来源于stack exchange,提问作者hyvel
相关产品推荐
相关产品推荐

