如何在字典结构中传递名称作为关键字?

问题描述:

我正在写书电话的二叉搜索树。问题是当我试图编写主代码时。我试图使用字典数据结构,但我无法弄清楚如何将联系人名称作为关键字。我想写任何名字,并把电话号码作为一个值。如何在字典结构中传递名称作为关键字?

它给了我一个错误

Traceback (most recent call last): 
    File "FastSort.py", line 22, in <module> 
    print(binarySearch(phonebook, "John")) 
    File "FastSort.py", line 8, in binarySearch 
    if alist[midpoint] == item: 
KeyError: 1 

这是一个代码

def binarySearch(alist, item): 
     first = 0 
     last = len(alist)-1 
     found = False 

     while first<=last and not found: 
      midpoint = (first + last)//2 
      if alist[midpoint] == item: 
       found = True 
      else: 
      if item < alist[midpoint]: 
        last = midpoint-1 
      else: 
       first = midpoint+1 
       return found 

phonebook = {} 
phonebook["John"] = 938477566 
phonebook["Jack"] = 938377264 
phonebook["Jill"] = 947662781 

print(binarySearch(phonebook, "John")) 
print(binarySearch(phonebook, "Jack")) 
+2

您应该使用二叉搜索的排序列表,而不是字典。 – sberry

+2

为什么你需要一个特殊的字典查找功能?他们已经是O(1)。 – TigerhawkT3

+3

'phonebook'有三个可能的键:'John','Jack','Jill';当你调用'alist [中点]','中点'是一个数字(在本例中为1)时,你正在调用'phonebook [1]',它不存在,因为它不是三个现有密钥之一 –

您的解决方案(如果alist作为一个真正的排序列表)相当接近,所以我想我会帮你出一bit:

import random 

def binarySearch(alist, item): 
    first = 0 
    last = len(alist)-1 

    while first<=last: 
     midpoint = (first + last)//2 
     print midpoint 
     if alist[midpoint][0] == item: 
      return alist[midpoint] 
     else: 
     if item < alist[midpoint][0]: 
       last = midpoint-1 
     else: 
      first = midpoint+1 
    return False 

items = [] 
items.append(("John", 938477566)) 
items.append(("Jack", 938377264)) 
items.append(("Jill", 947662781)) 

items = sorted(items)  

print(binarySearch(items, "John")) 
print(binarySearch(items, "Jack")) 
print(binarySearch(items, "Jill"))