如何筛选出不在enhancerlist任意子列表范围内的TFlist子列表
问题修正方案
原代码逻辑错误分析
原代码的核心问题是判断逻辑颠倒:对每个TF子列表,只要遇到一个不包含它的enhancer子列表,就立刻将其加入结果列表,完全忽略了后续可能存在的能包含它的enhancer子列表。正确逻辑应该是:只有当TF子列表不被enhancerlist中的任何一个子列表包含时,才将其加入结果。
修正后的while循环实现
可以通过引入标记变量来实现正确判断:先假设当前TF子列表未被任何enhancer包含,遍历所有enhancer进行验证——如果发现有一个enhancer能包含它,就修改标记并终止遍历;最后根据标记结果决定是否将该TF子列表加入结果。
代码示例:
enhancerlist = [[5,8],[10,11]] TFlist = [[6,7],[24,56]] TF_notinrange = [] while TFlist: TF = TFlist.pop() # 初始标记为「未被任何enhancer包含」 is_contained = False for j in enhancerlist: if TF[0] >= j[0] and TF[1] <= j[1]: # 找到能包含当前TF的enhancer,更新标记并跳出循环 is_contained = True break # 仅当未被任何enhancer包含时,加入结果列表 if not is_contained: TF_notinrange.append(TF) print(TF_notinrange) # 输出: [[24, 56]]
保持原列表顺序的while循环实现
上述代码用pop()会从TFlist末尾取元素,最终结果顺序与原列表相反。如果需要保留原顺序,可改用索引遍历的while循环:
enhancerlist = [[5,8],[10,11]] TFlist = [[6,7],[24,56]] TF_notinrange = [] index = 0 total = len(TFlist) while index < total: TF = TFlist[index] is_contained = False for j in enhancerlist: if TF[0] >= j[0] and TF[1] <= j[1]: is_contained = True break if not is_contained: TF_notinrange.append(TF) index += 1 print(TF_notinrange) # 输出: [[24, 56]]
内容的提问来源于stack exchange,提问作者Jillian Ness
相关产品推荐
相关产品推荐

