Python判断点列表所有点是否在指定矩形内的代码错误排查
问题背景
需要实现一个矩形范围点校验函数,规则为:接收两个矩形角点坐标、一个点列表作为入参,仅当列表内所有点都落在矩形范围内时返回True,其余情况均返回False。
预期运行结果:
allIn((0,0), (5,5), [(1,1), (0,0), (5,5)])→TrueallIn((0,0), (5,5), [(1,1), (0,0), (5,6)])→FalseallIn((0,0), (5,5), [])(空点列表) →False
当前编写的代码无法正确匹配后两种False场景,空列表返回值不符合要求,现有代码如下:
def allIn(firstCorner=(0,0), secondCorner=(0,0), pointList=[]): x1 = firstCorner[0] y1 = firstCorner[1] x2 = secondCorner[0] y2 = secondCorner[1] for i in range(len(pointList)): p_x = pointList[i][0] p_y = pointList[i][1] if not ((p_x >= x1 and p_x < x2) and (p_y >= y1 and p_y < y2)): return False return True print(allIn((0,0), (5,5), [(1,1), (0,0), (5,5)])) print(allIn((0,0), (5,5), [(1,1), (0,0), (5,6)])) print(allIn((0,0), (5,5), []))
代码逻辑错误定位
现有代码共存在3个核心逻辑bug,另有1个兼容性隐患:
- 边界判断规则错误:根据示例要求,矩形边界上的点属于范围内,当前代码用
p_x < x2、p_y < y2的严格小于判断,会把和右上角点重合的(5,5)判定为越界。 - 校验逻辑位置错误:范围判断写在了for循环外部,循环仅会不断覆盖
p_x、p_y的值,最终只校验列表最后一个点,前面所有点的越界情况都不会被检测到。 - 空列表分支缺失:传入空点列表时,for循环不会执行,代码会直接走到
return True分支,和空列表返回False的要求冲突。 - 兼容性隐患:代码默认第一个角点的横纵坐标都小于第二个角点,如果调用时传入角点顺序颠倒,判断逻辑会完全失效。
修正后可运行代码
def allIn(firstCorner=(0,0), secondCorner=(0,0), pointList=[]): # 空列表直接返回False if not pointList: return False # 计算矩形真实边界,兼容两个角点任意传入顺序 x_min = min(firstCorner[0], secondCorner[0]) x_max = max(firstCorner[0], secondCorner[0]) y_min = min(firstCorner[1], secondCorner[1]) y_max = max(firstCorner[1], secondCorner[1]) # 逐个校验点,任意点越界立刻返回False for px, py in pointList: if not (x_min <= px <= x_max and y_min <= py <= y_max): return False # 所有点校验通过返回True return True # 测试验证 print(allIn((0,0), (5,5), [(1,1), (0,0), (5,5)])) # 输出True print(allIn((0,0), (5,5), [(1,1), (0,0), (5,6)])) # 输出False print(allIn((0,0), (5,5), [])) # 输出False
内容的提问来源于stack exchange,提问作者liketylerwithak
相关产品推荐
相关产品推荐

