python二进制搜索和文件i / o

时间:2014-02-13 16:01:51

标签: python sorting search file-io binary-search

这是我被困的分配的一部分...... 我是python的新手,我想创建一个程序来搜索一个看起来更长的文件:

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维列表(这是必需的)...但我无法弄清楚如何将区域和人口转换为适当的类型。然后我必须对国家/地区名称进行二元搜索>任何提示?我知道如何在数字上做这个但是在名字上?

3 个答案:

答案 0 :(得分: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允许您将字符串与<>进行比较就好了;字符串按字典顺序进行比较。 ab小于ac,但ba大于ab。换句话说,将在另一个之前排序的字符串被视为“较小”。

因此,对排序的字符串列表进行二进制搜索与对已排序的数字列表进行二进制搜索没有什么不同。确保只查看元组的第一个元素:

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

答案 1 :(得分:0)

使用逗号作为分隔符而不是默认空格分割。 split为此目的提出了论据。每行将拆分为三元素列表。您需要使用intfloat函数将第二个和第三个条目从字符串转换为数字。

编辑:Python教程的这一部分有一些information about lists

答案 2 :(得分: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]