在列表中执行二进制搜索 - Python

时间:2014-02-07 00:58:04

标签: python list binary-search

我正在为我的计算机课程完成一项任务,我在处理一个问题时遇到了一些麻烦。问题1和2有两种重叠,所以我将发布两者,以及我到目前为止的代码。

问题1:编写一个名为readCountries的函数,该函数读取文件并返回国家/地区列表。应该从这个文件中读取这些国家,其中包含一个不完整的国家列表及其面积和人口。此文件中的每一行代表以下格式的一个国家/地区:

名称,面积(以km2为单位),人口

打开文件时,您的函数应该处理可能发生的任何异常。您的函数应该完全读入文件,并将数据分成二维列表。您可能需要根据需要拆分和删除数据。数字应转换为正确的类型。您的函数应返回此列表,以便您可以在剩余的问题中使用它。

这是我对此部分的代码:

    def readCountries():
        countryList = []
        for line in open('Countries.py', 'r'):
            with open('Countries.py', 'r') as countriesFile:
                countries = countriesFile.read()
                countryList.append(line.strip().split())
        return countryList

问题2:编写一个名为getCountry的函数,该函数将表示国家/地区名称的字符串作为参数。首先拨打问题1中的答案以获取国家/地区列表,然后通过列表进行二进制搜索并打印国家/地区的信息(如果找到)。

这是我对此部分的代码:

    countryList = readCountries()

    def getCountry(countryList, name):
        lo, hi = 0, len(countryList) - 1
        while lo <= hi:
            mid = lo + (hi - lo) // 2
            country = countryList[mid]
            test_name = country[0]
            if name > test_name:
                lo = mid + 1
            elif name < test_name:
                hi = mid - 1
            else:
                return country
        return countries[lo] if countries[lo][0] == name else None

输出是:['Canada', '9976140.0', '35295770']这部分是我需要的,但我怎么能看到这样:Canada, Area: 9976140.0, Population: 35295770

1 个答案:

答案 0 :(得分:1)

嗯,一个明显的问题是这一行:

readCountries() 

应该是这样的:

countryList = readCountries() 

通过让readCountries函数返回列表,你已经到了一半,但是你实际上从来没有为它返回的内容分配任何内容,所以它只是无处可去。