如何将列表分成几行,然后访问这些行的特定元素?

时间:2019-03-27 18:13:29

标签: python

我有一个家庭作业,向我提供了一个大约10,000行的文件。每行包含3个元素,即物种名称,纬度和经度。我需要编写一个函数,该函数返回给定位置在特定距离内发现的动物数量,并考虑到4个性能参数:文件名,距离以及该位置的经度和纬度。

在理想的世界中,我可以进入外壳,并使用文件名,任意距离,任意经度和纬度调用该函数,并计算该距离内的动物数量。

我已经成功地导入了文件,并且获得了一些代码示例,以帮助计算距离并将文件转换为列表。这是我到目前为止编写的代码:

def LocationCount(filename, distance, Lat1, Lon1):
FIn = open(filename, "r")
for Line in FIn:
    def LineToList(Line):
        Line = Line.rstrip()
    FIn.close()
    return Line.split("\t")

def CalculateDistance(Lat1, Lon1, Lat2, Lon2):

        Lat1 = float(Lat1)
        Lon1 = float(Lon1)
        Lat2 = float(Lat2)
        Lon2 = float(Lon2)

        nDLat = (Lat1 - Lat2) * 0.017453293
        nDLon = (Lon1 - Lon2) * 0.017453293

        Lat1 = Lat1 * 0.017453293
        Lat2 = Lat2 * 0.017453293

        nA = (math.sin(nDLat/2) ** 2) + math.cos(Lat1) * math.cos(Lat2) * (math.sin(nDLon/2) ** 2 )
        nC = 2 * math.atan2(math.sqrt(nA),math.sqrt( 1 - nA ))
        nD = 6372.797 * nC

return nD

1 个答案:

答案 0 :(得分:0)

要将行分成几部分,可以使用str.split()。例如,要将空白行分成3部分,可以使用_, lat, lon = line.strip().split(' ')(下划线只是表示您不想使用第一部分的对流)。

这是一个更完整的示例。我按照Python的样式约定(Google Python的PEP-8样式指南)对代码进行了格式化。

import math

def count_locations(filename, max_distance, source_lat, source_lon):
    counter = 0

    with open(filename) as f:
        for line in f:
            try:
                # try to split into 3 parts
                _, lat, lon = line.strip().split(' ')
            except ValueError:
                # cannot be split into 3 parts, so we skip this line
                continue

            try:
                # try to convert
                lat = float(lat)
                lon = float(lon)
            except ValueError:
                # cannot be converted to float, so we skip this line
                continue

            d = calculate_distance(source_lat, source_lon, lat, lon)
            if d <= max_distance:
                counter += 1

    return counter

def calculate_distance(lat_1, lon_1, lat_2, lon_2):
    n_d_lat = (lat_1 - lat_2) * 0.017453293
    n_d_lon = (lon_1 - lon_2) * 0.017453293

    lat_1 = lat_1 * 0.017453293
    lat_2 = lat_2 * 0.017453293

    n_A = (
            math.sin(n_d_lat / 2) ** 2
            + math.cos(lat_1) * math.cos(lat_2) * math.sin(n_d_lon / 2) ** 2
    )
    n_C = 2 * math.atan2(math.sqrt(n_A), math.sqrt(1 - n_A))
    n_D = 6372.797 * n_C

    return n_D

这对您有用吗?