关于使用any语句的合理性验证及非标产品名称标准化需求
非标准化产品名称标准化场景中any语句的合理性验证
在处理自由文本字段的非标准化产品名称标准化时,我们需要验证代码中any语句的使用合理性。现有实现通过字典存储非标名称到标准名称的映射,利用any判断当前产品是否需要转换,具体代码如下:
dict1 = {'product1': 'Product_1', 'prod1': 'Product_1', 'produc1': 'Product_1'} list1 = ['Product1', 'Product_1', 'ProDuc1'] list2 = [] for product in list1: if any(product.lower() in nonstandard for nonstandard in dict1): for bad_product_name in dict1: if product.lower() in bad_product_name: list2.append(dict1[bad_product_name]) else: list2.append(product) list2 # -> ['Product_1', 'Product_1', 'Product_1']
原代码中any语句的合理性
原代码使用any语句的核心目的是提前过滤掉不需要转换的产品名,避免进入内层循环执行无效的匹配操作,这个逻辑是合理的:
- 当产品名不存在任何非标匹配项时,直接跳过内层循环,将原名称加入结果列表,减少不必要的计算开销。
- 仅当存在匹配可能时,才进入内层循环查找具体的映射关系,符合"按需处理"的优化思路。
可优化点
原代码存在一个小问题:any判断时已经遍历了一次字典,找到匹配可能后又再次遍历字典查找具体映射,相当于做了两次重复遍历。可以通过合并判断与取值的步骤,减少一次遍历,提升效率,优化后的代码示例:
dict1 = {'product1': 'Product_1', 'prod1': 'Product_1', 'produc1': 'Product_1'} list1 = ['Product1', 'Product_1', 'ProDuc1'] list2 = [] for product in list1: prod_lower = product.lower() # 用next()直接获取第一个匹配的标准名称,无匹配则返回None matched_name = next((dict1[bad_name] for bad_name in dict1 if prod_lower in bad_name), None) list2.append(matched_name if matched_name else product) list2 # -> ['Product_1', 'Product_1', 'Product_1']
这个优化版本既保留了原逻辑中"避免不必要处理"的核心思路,又通过一次遍历完成判断与取值,效率更高。
内容的提问来源于stack exchange,提问作者Foggy Johnson
相关产品推荐
相关产品推荐

