Python 中的二进制搜索无法正常工作,仅显示列表中的某些项目

Binary search in Python not working properly, only displaying some items in list

我的代码工作不正常,只显示 3 个项目的正确结果,而不是第二个索引中的那个。我不会发布,但我是从 GCSE bitesize 页面上给出的 CS 伪代码开始的,当我在 Python 中转换时,它不起作用。 https://www.bbc.co.uk/bitesize/guides/zm77xfr/revision/3

my_list=['arnold', 'matt', 'david', 'james']

found = False
search_item = input("type a name to find")
start_range = 0
end_range = len(my_list)



while found == False and start_range <= end_range:
    mid = (start_range + end_range) //2

    if search_item == my_list[mid]:
        found == True
        print("item found")
    else:

        if my_list[mid] >= search_item:
            end_range = mid -1
        else:
            start_range = mid +1


if found == False:
    print("item not found")

当我 运行 上面的代码并输入 'arnold' 时,我得到一条无限打印的 'item found' 消息,目前还可以。但是,如果我输入列表中的第二项,在本例中为 'matt',我会收到 'item not found' 消息显示

如果我输入 'david' 或 'james' 它也有效,所以它只是第二个索引中的项目。

我最初在 python 中转换了 GCSE bitesize 伪代码,但它甚至没有用。我真的很困惑,我不清楚为什么它不起作用,但感觉它与索引甚至中间变量有关。

有人可以指导我检查哪个部分吗?

您这里有一些问题需要解决。首先,二分查找需要对列表进行排序,这样比较(即my_list[mid] >= search_item)才有意义。 接下来,您需要将 found == True 更改为 found = True。你拥有它的方式只是一个比较,而不是将值设置为 True.

它应该是这样的:

my_list=['arnold', 'matt', 'david', 'james']

found = False
search_item = input("type a name to find")
start_range = 0
end_range = len(my_list) - 1

# ADD THIS
my_list.sort()

while found == False and start_range <= end_range:
    mid = (start_range + end_range) //2

    if search_item == my_list[mid]:
        # CHANGE THIS
        found = True
        print("item found")
    else:

        if my_list[mid] >= search_item:
            end_range = mid -1
        else:
            start_range = mid +1

if found == False:
    print("item not found")