运行Python降序数组二分查找卡片代码出现list与int比较TypeError
报错原因
- 变量定义语法错误:你定义
cards的行末尾多了一个多余的逗号,Python会自动将带末尾逗号的单值定义为元组,此时cards实际是([20,19,18,17,16,15,13, 11, 10, 7, 4, 3, 1, 0],)格式的元组,而非你预期的整数列表。 - 运行时逻辑错误:调用checker函数取
cards[mid]时,实际取到的是元组内的整个列表,后续用列表和整数query做大小比较,直接触发类型报错。 - 额外逻辑错误:
locate_card函数的while循环条件完全错误,你错误地将计算得到的mid下标和待查找的数值query做比较,正确的二分查找终止条件应为lo <= hi,原条件会导致查找逻辑混乱、死循环或下标越界。
修复方案
- 删除
cards定义行末尾的多余逗号,使cards为正常的降序整数列表 - 将while循环条件修正为
lo <= hi - 补充查找失败的默认返回值,避免无匹配结果时返回
None
修改后的完整可运行代码:
# 去掉末尾多余逗号 cards = [20,19,18,17,16,15,13, 11, 10, 7, 4, 3, 1, 0] query = 1 def checker(cards,query,mid,lo,hi): mid_number = cards[mid] print('mid',mid,', mid_number: ',mid_number,' lo ',lo,' hi ',hi) if mid_number == query: if mid-1>=0 and cards[mid-1] == query: return 'left' else: return 'found' elif mid_number < query: return 'left' else: return 'right' def locate_card(cards, query): lo, hi = 0, len(cards) - 1 # 修正循环条件 while lo <= hi: mid = (lo + hi) // 2 result = checker(cards,query,mid,lo,hi) if result == 'found': return mid elif result == 'left': hi = mid - 1 elif result == 'right': lo = mid + 1 # 补充未找到的返回值 return -1 print(locate_card(cards, query))
运行后会输出正确的目标值下标12。
内容的提问来源于stack exchange,提问作者omar.ju
相关产品推荐
相关产品推荐

