2015-11-16 5 views
0

У меня есть этот список под названием countries.txt, в котором перечислены все страны по их названию, площади (в км2), численности населения (например, ["Афганистан", 647500,0,25500100]).Двоичный поиск

def readCountries(filename): 
    result=[] 
    lines=open(filename) 

    for line in lines: 
     result.append(line.strip('\n').split(',\t')) 
    for sublist in result: 
     sublist[1]=float(sublist[1]) 
     sublist[2]=int(sublist[2]) 

Это занимает в списке и распечатывается. Я хочу создать двоичный поиск и выполнить поиск по списку и распечатать информацию о стране, если она найдена. С помощью этого кода он должен сделать это

PrintCountry ("Канада") Канада, Площадь: 9976140,0, Население: 35295770

PrintCountry ("Winterfell") извини, не смог найти Winterfell в список стран.

Но он печатает Извините, не удалось найти Канаду в списке стран 4 раза, а затем печатает информацию Canadas.

Что происходит?

def printCountry(country): 

    myList=readCountries('countries.txt') 
    start = 0 
    end = len(myList)-1 
    while start<=end: 
     mid =(start + end)/2 
     if myList[mid][0] == country: 
      return '%s, Area: %.3f, Population: %i' %(country,myList[mid][1],myList[mid][2]) 
     elif myList[mid][0] > country: 
      end = mid - 1 
     else: 
      start = mid + 1 
     print "I'm sorry, could not find %s in the country list" %(country) 
+2

Я думаю, что 'print' должен находиться вне цикла while. – Caramiriel

ответ

1

Вы должны переместить неудачную сообщение после того, как время цикла и проверьте начало> конец (это означает, что страна не была найдена):

myList = readCountries('countries.txt') 
start = 0 
end = len(myList) - 1 
while start<=end: 
    mid = (start + end)/2 
    if myList[mid][0] == country: 
     return '%s, Area: %.3f, Population: %i' %(country,myList[mid][1],myList[mid][2]) 
    elif myList[mid][0] > country: 
     end = mid - 1 
    else: 
     start = mid + 1 
if start > end: 
    print "I'm sorry, could not find %s in the country list" %(country) 
+0

вам не нужен оператор if, поскольку функция вернется, если она будет найдена. –

+0

Спасибо, что это сработало – user5473706

1

Последняя строка

print "I'm sorry, could not find %s in the country list" %(country) 

должен находиться вне цикла while. Также убедитесь, что цикл завершен, не найдя ключ в файле, тогда только вы убедитесь, что имя страны не существует в списке.

# If condition taken from Michel's answer. 
if start > end: 
    print "I'm sorry, could not find %s in the country list" %(country) 
Смежные вопросы