2014-02-13 46 views
0

這是上我堅持...... 我是新來的蟒蛇,我想創建一個程序,通過它看起來像這樣只長一個文件搜索的assignement的一部分:蟒蛇二進制搜索和文件I/O

Afghanistan, 647500.0, 25500100 
Albania, 28748.0, 2821977 
Algeria, 2381740.0, 38700000 
American Samoa, 199.0, 55519 

正如你所看到的,間距不總是甚至......我想文字部分轉換爲字符串,該地區(第二列),以浮子和第三列(人口)至一個整數,但不知道如何處理它。 這是我到目前爲止有:

def readcountries(): 
    with open("countries.txt") as file: 
     lines = [line.split() for line in file] 

它返回一個2維列表(這是必需的)......但我無法弄清楚如何我將在面積和人口轉化到適當的類型。然後,我必須對國名進行二分查找>任何提示?我知道如何在數字而不是名稱上做到這一點?

+0

昨天你不是問這個問題爲user3207521嗎? https://stackoverflow.com/questions/21714485/binary-search-for-name/21714939 – hughdbrown

+0

nope不是我...但也許有人在我的班哈哈 – sbhb91

回答

1

這裏不要使用列表理解;這是可以做到,但變得醜陋快:

def readcountries(): 
    with open("countries.txt") as fh: 
     rows = [] 
     for line in fh: 
      name, area, population = line.split(',') 
      rows.append([name.strip(), float(area), int(population)]) 

列表內涵的版本是:

def readcountries(): 
    with open("countries.txt") as fh: 
     rows = [[n.strip(), float(a), int(p)] 
       for line in fh for n, a, p in (line.split(','),)] 

使用csv module會爲您節省一些處理:

import csv 

def readcountries(): 
    with open("countries.txt") as fh: 
     reader = csv.reader(fh, skipinitialspace=True) 
     rows = [[n, float(a), int(p)] for n, a, p in reader] 

這裏的模塊處理分割和剝離,爲每一行生成列表對象。

對於二進制搜索,利用Python可以用<>就好了比較字符串;字符串按字典順序進行比較。 abac小,但baab更大。換句話說,在另一個之前被排序的字符串被認爲是「較小的」。

作爲字符串的排序列表這樣,二進制搜索是從數字的排序列表上的二進制搜索沒有什麼不同。一定要確保你只看元組的第一個元素:

def bisect_right(rows, country, lo=0, hi=None): 
    if hi is None: 
     hi = len(rows) 
    while lo < hi: 
     mid = (lo + hi) // 2 
     if country < rows[mid][0]: 
      hi = mid 
     else: 
      lo = mid + 1 
    return lo 

def bisect_left(rows, country, lo=0, hi=None): 
    if hi is None: 
     hi = len(rows) 
    while lo < hi: 
     mid = (lo + hi) // 2 
     if rows[mid][0] < country: 
      lo = mid + 1 
     else: 
      hi = mid 
    return lo 
+0

'line.split()'應該'line.split( ',')' –

+0

您能否使用理解力展示解決方案? –

+1

@JayanthKoushik:'[[n,float(a),int(p)]用於行中的n,a,p in(line.split(','),)]' –

0

拆分使用逗號作爲隔膜而不是默認的是空格。 split爲此目的進行爭論。每條線將被分成三個元素的列表。您需要使用intfloat函數將字符串的第二個和第三個條目轉換爲數字。

編輯:這部分的Python教程有一些information about lists

0

您可以創建一個包含成員名稱,人口和麪積

class Country: 
    def __init__(self,name,area,population): 
     self.name = name 
     self.area = area 
     self.population = population 

一類國家試試這個代碼讀取文件和解析它,然後排序國家對象數組:

def readcountries(): 
    countries_array = [] 
    with open("countries.txt") as file: 
     lines = [line.split(',') for line in file] 
    for line in lines: 
     country = line[0].strip(' ') 
     area = line[1].strip(' ') 
     population = line[2].strip(' ') 
     countries_array.append(Country(country, area, population)) 

    sorted_countries = sorted(countries_array,key=operator.attrgetter('name')) 
    print [country.name for country in sorted_countries] 
+0

或者:'country,area,population =(item.strip(''))。 – hughdbrown