在元组列表中执行二分查找出错,输入'BB'无法得到正确结果
元组列表二分查找失败的问题解决
你的代码存在两个核心错误,导致无法正确定位目标元组:
错误点分析
- 比较对象错误:你直接用字符串
"BB"和整个元组arr[m]对比,得到的是布尔值(True/False),后续基于布尔值的大小判断(res > 0/res < 0)完全不符合二分查找逻辑——我们需要比较的是元组中的国家代码(第一个元素),而非整个元组。 - 相等判断逻辑错误:原代码中当
x != arr[m]时直接返回m-1,这完全违背二分查找规则,正确逻辑是找到匹配项时直接返回当前索引m。
修正后的代码
alldata = [('BA', 'Bosnia and Herzegovina', 44.0, 18.0), ('BB', 'Barbados', 13.17, -59.53), ('BD', 'Bangladesh', 24.0, 90.0), ('BE', 'Belgium', 50.83, 4.0), ('BF', 'Burkina Faso', 13.0, -2.0), ('BG', 'Bulgaria', 43.0, 25.0), ('BH', 'Bahrain', 26.0, 50.55), ('BJ', 'Benin', 9.5, 2.25), ('BM', 'Bermuda', 32.33, -64.75), ('BN', 'Brunei Darussalam', 4.5, 114.67)] def binarySearch(arr, x): l = 0 r = len(arr)-1 while l <= r: m = l + ((r - l) // 2) # 仅对比元组的第一个元素(国家代码) current_code = arr[m][0] if x == current_code: # 找到匹配项,直接返回当前索引 return m elif x > current_code: # 目标代码更大,调整左边界到右半区 l = m + 1 else: # 目标代码更小,调整右边界到左半区 r = m - 1 # 未找到匹配项时返回-1 return -1 inputq = "BB" result_index = binarySearch(alldata, inputq) if result_index != -1: print(alldata[result_index]) else: print("未找到匹配的国家代码")
代码说明
- 修正比较对象:将对比对象改为
arr[m][0],确保基于国家代码执行二分查找的核心逻辑。 - 修复二分逻辑:
- 匹配成功时直接返回当前索引,符合二分查找的终止条件。
- 根据字符串大小对比结果,正确调整左右边界,缩小查找范围。
- 简化输出逻辑:无需遍历整个列表,直接通过返回的索引获取目标元组,提升效率。
内容的提问来源于stack exchange,提问作者khamsablao laowords
相关产品推荐
相关产品推荐

