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

Python list.remove运行不符合预期 二分查找猜数字实现报错求解

问题原因分析
  • 核心逻辑错误:每次用户猜测值偏小时,你都会从1到当前猜测值逐个删除元素,但此前的猜测已经把更小的数字移除了,再次调用remove()删除不存在的元素就会抛出ValueError,你加的try/except只是掩盖了错误,没有解决逻辑问题。
  • 初始值不匹配:你初始化的列表是range(0,100),仅包含0~99的整数,但目标数字用random.randint(0,100)生成,可能出现100,100不在初始列表中会导致后续判断异常。
  • 操作效率低:列表的remove()方法是O(n)时间复杂度,循环删除多个元素会带来不必要的性能开销。
优化方案

最优方案:用左右边界替代列表维护(符合二分查找逻辑)

二分查找猜数字完全不需要维护整个数字列表,只需要记录当前可选的数字上下界即可,代码更简洁性能也更高:

import random

def binary_search_algo():
    number_to_guess = random.randint(0, 100)
    # 维护左右边界替代列表
    left, right = 0, 100
    while True:
        user_guess = int(input('Enter you guess: '))
        if user_guess < left or user_guess > right:
            print(f'当前可选数字范围是{left}~{right},请输入范围内的数字')
            continue
        if user_guess < number_to_guess:
            print('Too Low')
            # 直接更新左边界,所有小于等于猜测值的数字都被排除
            left = user_guess + 1
        elif user_guess > number_to_guess:
            print('Too High')
            # 直接更新右边界,所有大于等于猜测值的数字都被排除
            right = user_guess - 1
        else:
            print('Good job')
            break        

binary_search_algo()

保留列表的修正方案

如果你一定要保留列表实现,不要循环调用remove(),直接用列表推导式过滤出符合要求的元素即可:

import random

def binary_search_algo():
    number_to_guess = random.randint(0, 100)
    # 修正初始列表,包含0~100的所有整数
    random_number_list = list(range(0, 101))
    while True:
        user_guess = int(input('Enter you guess: '))
        if user_guess not in random_number_list:
            min_num, max_num = random_number_list[0], random_number_list[-1]
            print(f'由于之前的猜测,当前可选数字范围是{min_num}~{max_num},请输入范围内的数字')
            continue
        if user_guess < number_to_guess:
            print('Too Low')
            # 直接过滤保留所有大于猜测值的数字
            random_number_list = [x for x in random_number_list if x > user_guess]
        elif user_guess > number_to_guess:
            print('Too High')
            # 直接过滤保留所有小于猜测值的数字
            random_number_list = [x for x in random_number_list if x < user_guess]
        else:
            print('Good job')
            break        

binary_search_algo()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 08:54:02