Как перебрать список городов для расчета расстояний между ними - PullRequest
0 голосов
/ 20 февраля 2019

Я работаю над головоломкой, где хочу вычислить все возможные расстояния между 4 городами.Я написал функцию, в которой вы можете ввести координаты x и y двух городов, и она вычислит расстояние между ними.

Хотя я могу по отдельности вызывать функцию 6 раз, это кажется неэффективным, если набор данныхстановится больше.Я думаю, что я должен использовать вложенные «для циклов», но я не могу найти способ правильно увеличить внутренний цикл.

Моей первоначальной идеей было создать список объектов и использовать их во внутреннем цикле.

import math #Imports the math module

def calc_euclidean(x1,y1,x2,y2): #Function takes 4 arguments
    xDistancesqrd=math.pow((x2-x1),2) #x2-x1 squared
    yDistancesqrd=math.pow((y2-y1),2) #y2-y1 squared
    euclideanDistance=math.sqrt(xDistancesqrd+yDistancesqrd) #distance=square root (x2-x1)^2+(y2-y1)^2
    return euclideanDistance #Returns the result of the calculation, the euclidean distance between the points.

Budapest=[47.4979, 19.0402]
Vienna=[48.210033, 16.363449]
Sofia=[42.6977, 23.3219]
Zagreb=[45.8150, 15.9819]

cities=[Budapest,Vienna,Sofia,Zagreb]

1 Ответ

0 голосов
/ 20 февраля 2019

Использование itertools.combinations() как:

Код:

for c1, c2 in it.combinations(cities, 2):
    print(c1, c2, calc_euclidean(c1[0], c1[1], c2[0], c2[1]))

Код теста:

import math  # Imports the math module
import itertools as it


def calc_euclidean(x1, y1, x2, y2):  # Function takes 4 arguments
    xDistancesqrd = math.pow((x2 - x1), 2)  # x2-x1 squared
    yDistancesqrd = math.pow((y2 - y1), 2)  # y2-y1 squared
    euclideanDistance = math.sqrt(
        xDistancesqrd + yDistancesqrd)  # distance=square root (x2-x1)^2+(y2-y1)^2
    return euclideanDistance  # Returns the result of the calculation, the euclidean distance between the points.


Budapest = [47.4979, 19.0402]
Vienna = [48.210033, 16.363449]
Sofia = [42.6977, 23.3219]
Zagreb = [45.8150, 15.9819]

cities = [Budapest, Vienna, Sofia, Zagreb]
for c1, c2 in it.combinations(cities, 2):
    print(c1, c2, calc_euclidean(c1[0], c1[1], c2[0], c2[1]))

Результаты:

[47.4979, 19.0402] [48.210033, 16.363449] 2.769860885620431
[47.4979, 19.0402] [42.6977, 23.3219] 6.432330443159777
[47.4979, 19.0402] [45.815, 15.9819] 3.4907522541710128
[48.210033, 16.363449] [42.6977, 23.3219] 8.877266213327731
[48.210033, 16.363449] [45.815, 15.9819] 2.4252345681376934
[42.6977, 23.3219] [45.815, 15.9819] 7.974531916670721
...