如何实现带间隙范围限制的find_gappy子列表查找函数?
嘿,我来帮你搞定这个需求!咱们一步步实现符合要求的find_gappy函数。
实现思路
要解决这个问题,核心要做两件事:
- 确保
matches里的元素按顺序出现在目标子列表中 - 检查每一对相邻匹配元素之间的间隙(也就是中间隔的非匹配元素数量),不能超过指定的范围
完整代码实现
def find_gappy(target_list, matches, range_limit): match_count = len(matches) if match_count == 0: return True # 空匹配的情况可根据实际需求调整 current_match = 0 last_match_pos = -1 for idx, item in enumerate(target_list): if item == matches[current_match]: # 不是第一个匹配项时,检查间隙 if last_match_pos != -1: # 计算两个匹配项之间的间隙:当前位置 - 上一个匹配位置 - 1 gap_size = idx - last_match_pos - 1 if gap_size > range_limit: return False # 更新匹配进度和上一个匹配位置 last_match_pos = idx current_match += 1 # 所有匹配项都找到,直接返回符合条件 if current_match == match_count: return True # 遍历完都没找全所有匹配项,不符合要求 return False
代码说明
- 边界处理:如果传入的
matches是空列表,默认返回True,你可以根据实际需求改成False - 匹配遍历:逐个扫描目标子列表的元素,按顺序寻找
matches里的每一项 - 间隙检查:每找到一个匹配项,就计算它和上一个匹配项的间隙大小,一旦发现间隙超过
range_limit,直接返回False - 提前终止:当所有匹配项都按顺序找到且间隙符合要求时,直接返回
True,不用继续遍历
测试示例
用你给出的测试数据验证一下:
# 给定的输入列表 input_data = [ ['she', 'is', 'a', 'student'], ['she', 'is', 'a', 'lawer'], ['she', 'is', 'a', 'great', 'student'], ['i', 'am', 'a', 'teacher'], ['she', 'is', 'a', 'very', 'very', 'exceptionally', 'good', 'student'] ] matches = ['she', 'is', 'student'] # 筛选符合条件的子列表 filtered_result = [sub_list for sub_list in input_data if find_gappy(sub_list, matches, range_limit=2)] print(filtered_result)
运行后会得到预期结果:
[['she', 'is', 'a', 'student'], ['she', 'is', 'a', 'great', 'student']]
为什么最后一个子列表被排除?因为它里面a(位置2)和student(位置7)之间的间隙是7-2-1=4,超过了指定的range_limit=2,所以不符合要求。
内容的提问来源于stack exchange,提问作者Clement Attlee
相关产品推荐
相关产品推荐

