如何缩短冗余的多列表重复校验if语句,且保留功能支持通用扩展?
缩短冗余if校验语句的实现方案
你原有代码的本质是校验i中所有嵌套子元素全局无重复,基于这个逻辑可以直接把多层硬编码的判断替换为以下实现,完全不改变原有功能,且支持任意数量、任意长度的子列表适配。
方案1:最简通用实现(推荐)
直接将所有嵌套元素摊平后通过集合去重,对比去重前后的长度即可判断是否有重复元素,一行就能完成判断:
if len({elem for sublist in i for elem in sublist}) == sum(len(sublist) for sublist in i): best_combinations.append(i)
说明:
- 完全等价于原if判断的校验逻辑
- 自动适配任意数量的子列表、任意长度的子列表,无需修改代码
- 元素为可哈希类型(数字、字符串、元组等)时性能远优于原硬编码判断
方案2:提前终止优化版(适合大数据量场景)
如果嵌套元素数量较多,可以提前在遇到第一个重复元素时就终止检查,节省不必要的遍历开销:
def is_all_unique(nested_list): seen = set() for sub in nested_list: for e in sub: if e in seen: return False seen.add(e) return True if is_all_unique(i): best_combinations.append(i)
方案3:适配不可哈希元素版本
如果待校验的元素是列表等不可哈希类型,无法存入集合,可以改用列表存储已出现元素:
def is_all_unique_unhashable(nested_list): seen = [] for sub in nested_list: for e in sub: if e in seen: return False seen.append(e) return True if is_all_unique_unhashable(i): best_combinations.append(i)
内容的提问来源于stack exchange,提问作者Fredrik Berzins
相关产品推荐
相关产品推荐

