You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求二维数组中极大点的Python程序调试求助

排查极大点程序错误并修正

我来帮你梳理下代码里的问题,然后给出能正确输出极大点的解决方案:

首先看代码里的两个关键错误

  • 变量名不匹配:你定义的点列表是a,但后续排序和遍历的时候却用了mylist,这会直接抛出NameError,Python根本找不到mylist这个变量。
  • 逻辑判断混乱:你的核心思路(按x升序排序后从右往左检查y值)是可行的,但while循环的逻辑完全错了。按x升序排序后,右边的点x坐标都比当前点大,所以只要右边存在任意一个点的y坐标≥当前点的y,当前点就会被支配(x更大、y不更小),不属于极大点。你的代码里的循环没有正确判断这个条件,反而错误地累加j直到末尾才打印,导致结果不对。

修正后的代码(保留你的核心思路并优化)

我调整了变量名,同时简化了逻辑——其实不需要逐个比较右边所有点,只需要跟踪遍历过程中遇到的最大y值就可以了,效率更高:

# 原始点坐标列表
points = [[5,7],[47,84],[89,4],[46,54],[100,1]]

# 按x轴升序排序
points.sort(key=lambda x: x[0])

max_y = -float('inf')
max_points = []

# 从右往左遍历(x从大到小)
for point in reversed(points):
    x, y = point
    # 只要当前点的y比之前所有右边点的最大y大,就说明它是极大点
    # 因为右边的x更大但y更小,左边的x更小,无法支配它
    if y > max_y:
        max_points.append(point)
        max_y = y

# 输出成示例格式
output = ", ".join([f"({x},{y})" for x, y in max_points])
print(output)

如果需要保留点的名称(比如示例里的p2),可以把输入改成包含名称的结构,这样输出就能完全匹配示例:

# 带名称的点列表,空字符串代表没有名称的点
points = [("p1",5,7),("p2",47,84),("p3",89,4),("",46,54),("",100,1)]

# 按x坐标升序排序
points.sort(key=lambda x: x[1])

max_y = -float('inf')
max_points = []

for name, x, y in reversed(points):
    if y > max_y:
        # 根据是否有名称拼接字符串
        if name:
            max_points.append(f"{name}({x},{y})")
        else:
            max_points.append(f"({x},{y})")
        max_y = y

# 输出和示例完全一致的结果
print(", ".join(max_points))

运行这段代码会直接输出:p2(47,84), (89,4), (100,1)


逻辑验证(用你的示例输入)

排序后的点列表(按x升序):[[5,7], [46,54], [47,84], [89,4], [100,1]]
从右往左遍历:

  1. (100,1):当前max_y是负无穷,1更大,加入极大点,max_y更新为1
  2. (89,4):4>1,加入极大点,max_y更新为4
  3. (47,84):84>4,加入极大点,max_y更新为84
  4. (46,54):54<84,被支配,不加入
  5. (5,7):7<84,被支配,不加入
    最终得到的结果完全符合示例要求。

内容的提问来源于stack exchange,提问作者Pritesh Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:01:52