Python 使用二进制搜索和用户输入

Python 使用二进制搜索和用户输入,python,binary-search,Python,Binary Search,我试图找出如何在已经排序的列表上使用二进制搜索,这样我就可以让用户搜索用户输入的名称,并让它显示名称(如果有)或告诉用户名称(如果没有) 我不能使用内置的排序函数 我使用气泡搜索设置对用户输入的姓名列表进行排序,其代码如下: def names(): members = [] done = False while done != True: mem = input("Enter a name, enter 'done' when finished: ")

我试图找出如何在已经排序的列表上使用二进制搜索,这样我就可以让用户搜索用户输入的名称,并让它显示名称(如果有)或告诉用户名称(如果没有)

我不能使用内置的排序函数

我使用气泡搜索设置对用户输入的姓名列表进行排序,其代码如下:

def names():
  members = []
  done = False
  while done != True:
    mem = input("Enter a name, enter 'done' when finished: ")
    if mem == "done":
      done = True
    else:
      members.append(mem)
    print(members)

    index = len(members) - 1
    sort = False

    while not sort:
        sort = True
        for j in range(0, index):
            if members[j] > members[j + 1]:
                sort = False
                members[j], members[j + 1] = members[j + 1], members[j]


#Here is the output for the first code:

Enter a name, enter 'done' when finished: Bob
['Bob']
Enter a name, enter 'done' when finished: George
['Bob', 'George']
Enter a name, enter 'done' when finished: Mike
['Bob', 'George', 'Mike']
Enter a name, enter 'done' when finished: Zed
['Bob', 'George', 'Mike', 'Zed']
Enter a name, enter 'done' when finished: Vorp
['Bob', 'George', 'Mike', 'Zed', 'Vorp']
Enter a name, enter 'done' when finished: done
['Bob', 'George', 'Mike', 'Vorp', 'Zed']

我创建了另一个用于搜索排序列表的函数,这就是我遇到的问题。我尝试将排序后的列表放入我的
main()
函数中,但它没有打印任何内容

def main(members):
    name_search = input("Please enter the name you're looking for: ")
    print(name_search)
    begin_index = 0
    end_index = len(members) -1
    
    while begin_index <= end_index:
        midpoint = begin_index + (end_index - begin_index) // 2
        midpoint_value = members[midpoint]
        if midpoint_value == members:
            return midpoint
        elif members < midpoint_value:
            end_index = midpoint - 1

        else:
            begin_index = midpoint + 1
    print(members)

    return None
names()
def main(成员):
name\u search=input(“请输入您要查找的名称:”)
打印(名称搜索)
开始索引=0
end_index=len(成员)-1

begin_index基本上与常规二进制搜索的算法相同,只需将数字列表替换为名称列表:

def binary(lst, sml, bg, x): 
    if bg >= sml: 
        mid = (bg + sml) // 2
        if lst[mid] == x: 
            return mid 
        elif lst[mid] > x: 
            return binary(lst, sml, mid - 1, x) 
        else: 
            return binary(lst, mid + 1, bg, x) 
    else: 
        return -1
  
lst = ['Bob', 'George', 'Mike', 'Vorp', 'Zed'] 
x = input('Input the name: ')

index = binary(lst, 0, len(lst)-1, x) 
  
if index != -1: 
    print(index) 
else: 
    print("Not in list.") 
输入:

Input the name: Mike
输出:

2

您正在将
中点\u值
与整个列表进行比较,而不是
名称\u搜索
。试试这个:

    if midpoint_value == name_search:
        return midpoint
    elif name_search  < midpoint_value:
        end_index = midpoint - 1
    else:
        begin_index = midpoint + 1
如果中点\u值==名称\u搜索:
返回中点
elif名称搜索<中点搜索值:
结束指数=中点-1
其他:
开始索引=中点+1
此外,对于您将来的问题,请确保提供一个最小的可重复示例,例如:

def search(name_search, members):

    begin_index = 0
    end_index = len(members) -1
    
    while begin_index <= end_index:
        midpoint = begin_index + (end_index - begin_index) // 2
        midpoint_value = members[midpoint]
        if midpoint_value == name_search :
            return midpoint
        elif name_search  < midpoint_value:
            end_index = midpoint - 1
        else:
            begin_index = midpoint + 1
    
    return None

members = ['Bob', 'George', 'Mike', 'Vorp', 'Zed']
name_search = 'George'

print(search(name_search, members))
def搜索(名称搜索,成员):
开始索引=0
end_index=len(成员)-1
在开始索引时,请提供一个。