我的代码的第一部分是计算地球上两个地点之间的距离我的代码的第二部分返回一个列表,其中包含存储在数据库中的美国所有城市。数据库保存在一个名为“city_data.db”的文件中,该文件包含一个名为“cities”的表,其中包含列(“country_code”、“city_name”、“region”、“population”、“latitude”、“longitude”)。请注意,美国的国家代码是“US”。
我的代码的第三部分是返回一个列表,其中包含存储在数据库中的所有城市,这些城市是按照它们与布法罗市的大圆距离排序的用(42.8864,-78.8784)表示水牛的经纬度
输入[]时出现错误:findDistance()接受0个位置参数,但给出了1个。我做错什么了?

import sqlite3
import math
conn = sqlite3.connect("city_data.db")
c = conn.cursor()
conn.commit()

#Part 1
def great_circle_distance(lat1, lon1, lat2, lon2):
    radius = 6371

    dlat = math.radians(lat2-lat1)
    dlon = math.radians(lon2-lon1)
    a = math.sin(dlat/2) * math.sin(dlat/2) + math.cos(math.radians(lat1)) \
        * math.cos(math.radians(lat2)) * math.sin(dlon/2) * math.sin(dlon/2)
    c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
    d = radius * c

    return d

#Part 2
def get_us_cities():
    get_city = c.execute("SELECT * FROM cities WHERE country_code = 'us'").fetchall()
    return [x for x in get_city]

#Part 3
def findDistance():
    citieslist = get_us_cities()
    lat1 = 42.8864
    lon1 = -78.8784
    lat2 = citieslist[4]
    lon2= citieslist[5]
    distance = great_circle_distance(lat1, lon1, lat2, lon2)
    return distance

def closest_cities():
    array = get_us_cities()
    array.sort(key = findDistance)
    return array

最佳答案

你在做什么

array.sort(key = findDistance)

这意味着排序算法正在使用findDistance()为其排序的每个值查找一个“键”。基本上,它接受一个列表,对该列表中的每个项执行findDistance()操作,然后根据返回值对列表进行排序因此,array.sort()期望无论它被指定为一个key值,都能够获取一个值并输出另一个可用于排序的值。
我不知道您是如何构建数据库的,也不知道您的数组将采用什么格式,但是让我们假设在这个示例中,数组中的每个项都是一个列表,其中的索引与您列出的列相对应(例如,“latitude”将是index4,“longitude”将是index5,等等)。然后,您需要重写findDistance()以将其中一个作为参数:
def findDistance(city):
    lat1 = 42.8864
    lon1 = -78.8784
    lat2 = city[4]    # notice how we're using the variable that was passed in,
    lon2 = city[5]    #   instead of accessing get_us_cities()
    distance = great_circle_distance(lat1, lon1, lat2, lon2)
    return distance

10-08 14:31