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

Python中角度列表区间匹配与数量统计的代码问题排查及修正

问题排查与解决方案

错误原因分析

  • 条件判断逻辑完全错误:原代码中if angle_circle[j] < angle_geometry[i] > angle_circle[j+1]的逻辑是判断角度同时大于区间两端值,这和"匹配区间"的需求完全相悖。正确逻辑应该是判断角度处于[angle_circle[j], angle_circle[j+1})区间内。
  • 冗余无效代码:else分支的node_container[j] = node_container[j]没有任何实际作用,属于冗余代码。
  • 未提前终止内层循环:找到匹配区间后仍继续遍历所有区间,导致无意义的性能浪费。

正确实现代码

基础修复版本

先初始化全0的node_container,修正条件判断并优化循环逻辑:

angle_circle = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 260, 270, 280, 290, 300, 310, 320, 330, 340, 350, 360]
angle_geometry = [252.41, 242.53, 214.7, 151.7, 166.43, 141.58, 119.48, 82.57, 50.44, 33.31, 11.31, 20.22, 66.8, 288.43, 276.84, 274.18]

# 初始化node_container,长度等于区间数量(circle列表长度-1)
node_container = [0] * (len(angle_circle) - 1)

for angle in angle_geometry:
    for j in range(len(angle_circle)-1):
        # 匹配左闭右开区间:[angle_circle[j], angle_circle[j+1})
        if angle_circle[j] <= angle < angle_circle[j+1]:
            node_container[j] += 1
            break  # 找到区间后立即终止内层循环

print(node_container)

运行结果与预期完全一致:

[0, 1, 0, 0, 2, 0, 1, 0, 0, 3, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

高效优化版本(使用bisect模块)

由于angle_circle是严格递增的有序列表,可利用Python内置bisect模块快速定位区间,将时间复杂度从O(n*m)降至O(n log m):

import bisect

angle_circle = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 260, 270, 280, 290, 300, 310, 320, 330, 340, 350, 360]
angle_geometry = [252.41, 242.53, 214.7, 151.7, 166.43, 141.58, 119.48, 82.57, 50.44, 33.31, 11.31, 20.22, 66.8, 288.43, 276.84, 274.18]

node_container = [0] * (len(angle_circle) - 1)

for angle in angle_geometry:
    # 找到第一个大于当前角度的区间端点索引,减1即为对应区间的下标
    idx = bisect.bisect_left(angle_circle, angle) - 1
    # 处理角度等于360的边界情况,将其归入最后一个区间
    if idx == len(node_container):
        idx -= 1
    node_container[idx] += 1

print(node_container)

补充说明

  • 区间开闭:示例采用左闭右开逻辑,若需左开右闭,可将条件改为angle_circle[j] < angle <= angle_circle[j+1],同时将bisect_left替换为bisect_right。
  • 边界处理:优化版本已考虑角度等于360的情况,确保其被统计到350-360区间内。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 04:06:25