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

运行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,原条件会导致查找逻辑混乱、死循环或下标越界。
修复方案
  1. 删除cards定义行末尾的多余逗号,使cards为正常的降序整数列表
  2. 将while循环条件修正为lo <= hi
  3. 补充查找失败的默认返回值,避免无匹配结果时返回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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:15:03