如何避免嵌套for循环高效匹配查找列表中的相似列定义?
高效查找缺失列的SQL定义方案
问题背景
我有两个列表:一个是列名列表,另一个是带数据类型的列定义查找列表。目前检测到缺失列 cols_diff = ['VendorPartNumber'],查找列表如下:
table_cols_lookup = ['[Asset] NVARCHAR(MAX)', ' [SKU] NVARCHAR(MAX)', ' [BreakFix] NVARCHAR(MAX)', ' [Carrier] NVARCHAR(MAX)', ' [Created] NVARCHAR(MAX)', ' [CreatedBy] NVARCHAR(MAX)', ' [Code] NVARCHAR(MAX)', ' [Full] NVARCHAR(MAX)', ' [IsItem] NVARCHAR(MAX)', ' [LNumber] NVARCHAR(MAX)', ' [OrderedQuantity] NVARCHAR(MAX)', ' [OrderIntent] NVARCHAR(MAX)', ' [OrderNumber] NVARCHAR(MAX)', ' [OrderType] NVARCHAR(MAX)', ' [ReceivedLocation] NVARCHAR(MAX)', ' [ReceivedQuantity] NVARCHAR(MAX)', ' [RemainingQuantity] NVARCHAR(MAX)', ' [SerialNumber] NVARCHAR(MAX)', ' [SKUId] NVARCHAR(MAX)', ' [SkuName] NVARCHAR(MAX)', ' [Supplier] NVARCHAR(MAX)', ' [VendorPartNumber] NVARCHAR(MAX)']
原本用嵌套for循环匹配缺失列的定义,但当列数增长到500+时担心效率不足,原代码如下:
for col in table_cols_lookup: for dcol in cols_diff: if dcol in col: print(col)
高效查找方案
1. 集合+生成器表达式(推荐)
把缺失列转成集合(集合的in操作是*O(1)时间复杂度),然后只遍历一次查找列表即可完成匹配,时间复杂度从嵌套循环的O(nm)降到O(n):
cols_diff_set = set(cols_diff) # 生成器表达式,按需迭代获取结果 matched_cols = (col for col in table_cols_lookup if any(dcol in col for dcol in cols_diff_set)) # 输出匹配结果 for col in matched_cols: print(col)
如果能确定每个缺失列在查找列表中唯一,也可以用列表推导式直接获取所有结果:
cols_diff_set = set(cols_diff) matched_cols = [col for col in table_cols_lookup if any(dcol in col for dcol in cols_diff_set)] print(matched_cols)
2. 预构建字典映射(最优性能)
如果查找列表不会频繁变动,建议预先把列名和对应的定义映射成字典,后续查找直接以*O(1)*时间获取结果:
# 预处理:提取列名作为key,完整列定义作为value col_def_map = {} for col_def in table_cols_lookup: # 处理可能的空格,提取[]中的列名 cleaned_def = col_def.strip() col_name = cleaned_def.split(']')[0].strip('[') col_def_map[col_name] = cleaned_def # 快速查找缺失列的定义 for dcol in cols_diff: if dcol in col_def_map: print(col_def_map[dcol])
这种方法只需预处理一次,后续无论多少次查找都能瞬间完成,尤其适合列数多、重复查找的场景。
3. 函数式风格:filter+lambda
如果偏好函数式写法,可以用filter配合lambda表达式实现:
cols_diff_set = set(cols_diff) matched_cols = filter(lambda col: any(dcol in col for dcol in cols_diff_set), table_cols_lookup) for col in matched_cols: print(col)
内容的提问来源于stack exchange,提问作者mcbdx
相关产品推荐
相关产品推荐

