как получить мой цикл для вычисления расстояния между координатами в списке - PullRequest
2 голосов
/ 06 ноября 2019

Я пишу программу для расчета расстояния для каждого элемента списка между широтой и долготой из файла, например, если мой список точек имеет пять точек p1, p2, p3, p4 и p5, я хочу, чтобы программа нашларасстояние между точками p1 и p2, p1 и p3, p1 и p4 и p1 и p5. Затем вычислите расстояние между p2 и p3, p2 и p4, p2 и p5 и т. Д., Но не можете получить выходные данные для вычисления расстояния между всеми точками в моем списке. , 170,1144522172567 57.96358548631895,65.88075339171547 24.001352068102108,1.3473208526774272 -64.06840683422311,153.52144681056024

infile=open('test_part2.txt','r')
lines=infile.readlines()
infile.close()
def get_distance(p1,p2):
        x1=p1[0]
        y1=p1[1]
        x2=p2[0]
        y2=p2[1]
        d=(x1-x2)**2+(y1-y2)**2
        d=d**0.5
        return d
print ('Pairwise distance between points:')
points=[]
for line in lines:
    line = line.strip()
    tokens=line.split(",")
    lat=float(tokens[0].strip())
    lon=float(tokens[1].strip())
    point=[]
    point.append(lat)
    point.append(lon)
    points.append(point)
    for i in range(0,len(points)):
        d=get_distance(point,points[i])
        print(d)

ожидаемый выход 66,26088847230339 45,17926239576636 +115,99441689212239 +133,32118853696534 +107,27690301949622 +168,9856796040263 +98,07518883014596 72,92459951226348 150,24213221549 +175,82163417554528

Ответы [ 2 ]

0 голосов
/ 06 ноября 2019

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

62.24186067241206,110.85699280829596

32.59293412296685,170.1144522172567

Обновлен код

infile = open('test_part2.txt', 'r')
lines = infile.readlines()
infile.close()

def get_distance(p1, p2):
  x1 = p1[0]
  y1 = p1[1]
  x2 = p2[0]
  y2 = p2[1]
  d = (x1 - x2) ** 2 + (y1 - y2) ** 2
  d = d ** 0.5
  return d

print('Pairwise distance between points:')
points = []
for line in lines:
  line = line.strip()
  tokens = line.split(",")
  lat = float(tokens[0].strip())
  lon = float(tokens[1].strip())
  point = [lat, lon]
  points.append(point)

for i in range(0, len(points)):
   for j in range(i+1, len(points)):
      d = get_distance(points[j], points[i])
      print(d)
0 голосов
/ 06 ноября 2019

Модуль itertools предоставляет функцию комбинаций, которая выглядит идеально для этого, предполагая, что ваши данные представляют собой список пар кортежей, например:

import itertools as it
#
if __name__ == "__main__":
    points =[(0,0), (4,0), (4,3), (1,1)]
    temp = list(it.combinations(points, 2))
    for pair in temp:
        print(f"{pair} distance = {get_distance(pair[0], pair[1])}")

Дает этот вывод:

(0, 0), (4, 0) = 4.0
(0, 0), (4, 3) = 5.0
(0, 0), (1, 1) = 1.4142135623730951
(4, 0), (4, 3) = 3.0
(4, 0), (1, 1) = 3.1622776601683795
(4, 3), (1, 1) = 3.605551275463989

Отредактируйте, если вы не можете использовать itertools, это может быть обходной путь:

count = 0
combos = []
while count < len(points):
    temp = [(points[count], x) for x in points[count+1:]]
    combos.extend(temp)
    count += 1
for x in combos:
    print x

Понимание списка не слишком сложно разбить на циклы, если этого требует ваша школа. Однако нарезка более или менее обязательна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...