Python如何实现多条目批量映射到同一函数,减少冗余if-else判断?
Python多分类匹配处理的优雅实现方案
这里提供两种符合Python风格的实现,都可以彻底避免写大量if-else判断,新增分类时只需要加一行配置即可:
方案1:预生成条目-处理函数映射(性能最优)
适合分类固定、条目总数量不大的场景,运行时查找效率为O(1):
# 原有函数和分类定义不变 def eat_food(item): print(f'I ate {item}') def own_pet(item): print(f'I own {item}') def live_place(item): print(f'I live in {item}') animal = ['cat', 'dog', 'bird'] food = ['pizza', 'ham', 'cake'] place = ['Italy', 'USA', 'Malaysia'] # 仅需维护这一个分类-函数对应配置,新增分类直接加一行即可 category_config = [ (animal, own_pet), (food, eat_food), (place, live_place) ] # 动态生成条目到处理函数的映射,无需手动绑定每个条目 item_handler = {} for category, handler in category_config: for item in category: item_handler[item] = handler # 调用逻辑 random_list = ['cat', 'cake', 'pizza', 'USA'] for item in random_list: item_handler[item](item)
如果存在条目不在任何分类的场景,可以指定默认处理函数:
# 示例默认处理函数 def default_handler(item): print(f'未匹配到分类的条目:{item}') # 调用时用get方法兜底 for item in random_list: item_handler.get(item, default_handler)(item)
方案2:动态遍历匹配(扩展性最强)
适合分类经常动态修改、条目总数量极大的场景,无需每次修改分类都重新生成全局映射:
# 分类配置改用set存储,in查找效率为O(1)远高于列表 category_config = [ (set(animal), own_pet), (set(food), eat_food), (set(place), live_place) ] random_list = ['cat', 'cake', 'pizza', 'USA'] for item in random_list: for category, handler in category_config: if item in category: handler(item) break else: # 未匹配到分类的兜底逻辑 print(f'未知条目:{item}')
如果你更偏好字典形式的配置,可以用可哈希的frozenset作为字典的键(普通列表无法作为字典键):
category_config = { frozenset(animal): own_pet, frozenset(food): eat_food, frozenset(place): live_place } for item in random_list: for category, handler in category_config.items(): if item in category: handler(item) break
两种方案都完全满足「仅维护分组和函数的对应关系,不用写逐条目绑定和多分支判断」的需求,新增分类时仅需要在配置里加一行对应关系即可,不需要修改任何执行逻辑。
内容的提问来源于stack exchange,提问作者wanburana
相关产品推荐
相关产品推荐

