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

问题描述 投票:0回答:1

我的代码无法正常工作,只能显示3个项目的正确结果,而不能显示第二个索引中的一项。我不会发表,但是我从CS的GCSE bitesize页面上给出的伪代码中删除,当我在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'时,我得到一条'已找到项目'的消息,它无限打印,目前是可以的。但是,如果我输入列表中的第二项,在这种情况下为“哑光”,则会显示“找不到项目”消息显示

如果我输入'david'或'james',它也可以正常工作,因此它只是第二个索引中的项目。

我最初在python中转换了GCSE bitesize伪代码,但是它甚至没有用。我真的很困惑,我不清楚为什么它不起作用,但是感觉到它与索引甚至中间变量有关。有人可以指示我检查哪一部分

python list search counter
1个回答
0
投票

您这里有一些问题需要解决。首先,二进制搜索需要对列表进行排序,这样比较(即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")

© www.soinside.com 2019 - 2024. All rights reserved.