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
相关产品推荐
相关产品推荐

