Получение ошибки на входе []: findDistance () принимает 0 позиционных аргументов, но 1 был дан - PullRequest
0 голосов
/ 25 ноября 2018

Первая часть моего кода вычисляет расстояние между двумя точками на Земле.Вторая часть моего кода возвращает список, содержащий все города, хранящиеся в базе данных, которые находятся в Соединенных Штатах.База данных сохраняется в файле с именем «city_data.db», содержащем таблицу с названием «города» со столбцами («код страны», «имя города», «регион», «население», «широта», «долгота»).Обратите внимание, что код страны для Соединенных Штатов - «мы».

Третья часть моего кода возвращает список, содержащий все города, хранящиеся в базе данных в Соединенных Штатах, отсортированные по их большому кругу.Расстояние от города Буффало.Используйте (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

1 Ответ

0 голосов
/ 25 ноября 2018

Вы делаете

array.sort(key = findDistance)

Это означает, что алгоритм сортировки использует findDistance(), чтобы найти «ключ» для каждого значения, которое он сортирует.По сути, он принимает список, делает findDistance() для каждого элемента в этом списке, а затем сортирует список по возвращаемым значениям.Таким образом, array.sort() ожидает, что все, что указано как key, сможет принять одно значение и выплюнуть другое значение, которое можно использовать для сортировки.

Я не знаю, как вы структурируете свою базу данных, или в каком формате будет ваш массив, но давайте предположим для этого примера, что каждый элемент в массиве является списком с индексами, соответствующимистолбцы, которые вы перечислили (например, «широта» будет индексом 4, «долгота будет индексом 5 и т. д.). Затем вам нужно переписать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...