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

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

优化点说明:

  1. 存储结构简化:用self.products字典替代原有的两个结构,既减少了代码维护成本,又提升了存在性检查的效率。
  2. 逻辑复用清晰:
    • _item_exists作为内部辅助方法,封装最基础的存在性判断逻辑,供内部方法调用
    • require_item_exists封装“必须存在”的校验逻辑,抛出更明确的ValueError(比通用的Exception更规范),供update/remove等方法复用
  3. 方法职责单一:每个方法只做一件事,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 09:35:37