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

Python迭代式Binary Search实现异常求助:仅拆分一次列表

迭代式二分查找问题排查

核心问题分析

  1. 原始列表未排序
    二分查找的核心前提是操作对象为有序列表,你提供的列表[3,6,8,12,14,17,25,29,31,36,42,47,63,55,62]末尾的63,55,62是无序状态,这会直接导致查找逻辑无法正确定位目标值。

  2. 条件判断重复
    你的for循环里两个分支的判断条件完全一致:

if list[mid(list)] < key:
    list = list[mid(list)+1:]
elif list[mid(list)] < key:  # 这里应该是 > key
    list = list[mid(list)-1:]

第二个elif分支永远不会被触发,所以当第一次切片后,后续循环只会持续进入第一个分支,导致一直输出后半部分列表。

  1. 变量名冲突
    使用list作为变量名会覆盖Python内置的list类型,这是不规范的编程习惯,可能引发后续代码的潜在问题,建议改用sorted_nums这类自定义名称。

  2. 缺少目标值匹配后的终止逻辑
    当找到目标值key时,没有终止循环的逻辑,会继续执行不必要的切片操作。

修正后的代码

# 先确保列表是有序的
sorted_nums = sorted([3,6,8,12,14,17,25,29,31,36,42,47,63,55,62])
key = 42
print("初始有序列表:", sorted_nums)

def high(sorted_list):
    return len(sorted_list)
    
def low(sorted_list):
    return 0  

def mid(sorted_list):
    # 简化mid计算,和原逻辑等价
    return (low(sorted_list) + high(sorted_list)) // 2

# 替换硬编码循环,改为动态循环直到找到或范围为空
current_list = sorted_nums.copy()
while current_list:
    mid_idx = mid(current_list)
    mid_val = current_list[mid_idx]
    if mid_val < key:
        current_list = current_list[mid_idx+1:]
    elif mid_val > key:
        current_list = current_list[:mid_idx]  # 取左半部分,避免丢失元素
    else:
        print(f"找到目标值 {key}")
        break
    print("当前列表:", current_list)
else:
    print(f"未找到目标值 {key}")

额外说明

  • 修正了切片逻辑:当mid值大于key时,应该取列表的前半部分current_list[:mid_idx],而不是mid_idx-1:,否则会丢失mid_idx之前的元素。
  • 改用while循环替代硬编码的for循环,让查找逻辑更通用,能处理任意长度的有序列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 03:54:15