2015-11-16 240 views
0

我有這個名爲countries.txt的列表,按其名稱,面積(以km2),人口(例如[「Afghanistan」,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( 「冬」) 對不起,找不到冬在國家名單。

但它打印對不起,在國家名單中找不到加拿大4次然後打印加拿大信息。

這是怎麼回事?

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

你有while循環後,將你的失敗消息,並檢查是否開始>結束(這意味着該國未找到):

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)