Я должен написать функцию tourlength (тур, местоположения), которая возвращает общее расстояние в виде числа с плавающей точкой данного тура, то есть сумму расстояний между местоположениями в туре. Например, экскурсия ("ngv", "fed square", "myhotel") имеет общее расстояние 4,0

Мой код:

    import math

def distance(x1, y1, x2, y2):                                                    
    return math.sqrt((x2 - x1)**2 + (y2 - y1)**2) 


def tourlength(tour, locations):
    DBP = []
    tour_list = [i for i in locations if i[0] in tour]
    coordinate = [i[1:] for i in tour_list]
    x_coordinate = [i[0] for i in coordinate]
    y_coordinate = [i[1] for i in coordinate]
    a = 0
    b = 1
    j = 0
    while j <= (len(tour_list)-2):
      distances = distance(x_coordinate[a], y_coordinate[a], x_coordinate[b], y_coordinate[b])
      DBP.append(distances)
      a += 1
      b += 1
      j += 1
    return sum(DBP)

Допустим, моя функция определена как:

tourlength(["ngv", "fed square", "myhotel"], [("ngv", 4, 0), ("town hall", 4, 4),("myhotel",  2, 2), ("parliament", 8, 5.5), ("fed square",  4, 2)]))

Возвращаемое значение равно 4. Однако моя функция возвращает значение 4.82842712474619, которое является значением для списка туров ["ngv", "myhotel", "fed square"]

Я понимаю, что мой код работает, но не работает в правильном порядке, который, как я полагаю, связан с этой частью: tour_list = [i for i in locations if i[0] in tour], но я не уверен в том, чтобы настроить его без импорта других встроенных функций python.

Заранее спасибо

0
Akira Wang 31 Авг 2017 в 16:13

3 ответа

Лучший ответ

Ваш tour_list основан на заказе на местах, а не на турах. Это лучше реализовать с помощью dict.

import math

def distance(x1, y1, x2, y2):                                                    
    return math.sqrt((x2 - x1)**2 + (y2 - y1)**2) 


def tourlength(tour, locations):
    DBP = []
    coordinates = {}
    for item in locations:
      coordinates[item[0]] = item[1:]
    j = 0
    while j <= (len(tour)-2):
      dest_1 = tour[j]
      dest_2 = tour[j + 1]
      distances = distance(coordinates[dest_1][0], coordinates[dest_1][1], coordinates[dest_2][0], coordinates[dest_2][1])
      DBP.append(distances)
      j += 1
    return sum(DBP)
0
eman.lodovice 31 Авг 2017 в 13:41

Вместо использования списка, используйте словарь для местоположений (это более логично) с этой структурой:

  • Расположение 1: (X1, Y1)
  • Расположение 2: (X2, Y2)

Вот что вы получите:

locations = dict()
locations["ngv"] = (4, 0)
locations["town hall"] = (4, 4)
locations["myhotel"] = (2, 2)
locations["parliament"] = (8, 5.5)
locations["fed square"] = (4, 2)

Затем я сделаю это так:

import math

locations = dict()
locations["ngv"] = (4, 0)
locations["town hall"] = (4, 4)
locations["myhotel"] = (2, 2)
locations["parliament"] = (8, 5.5)
locations["fed square"] = (4, 2)

tour = ["ngv", "fed square", "myhotel"]

def distance(x1, y1, x2, y2):                                                    
    return math.sqrt((x2 - x1)**2 + (y2 - y1)**2) 

def tourlength(tour, locations):
    Distance = 0
    # Initial position
    X0 = locations[tour[0]][0]
    Y0 = locations[tour[0]][1]

    # Counter
    i = 1
    while i < len(tour):
        X = locations[tour[i]][0]
        Y = locations[tour[i]][1]

        # Add the distance
        Distance += distance(X0, Y0, X, Y)

        # Reset the initial position
        X0 = X
        Y0 = Y

        # Increment counter 
        i += 1

    return Distance

print (tourlength(tour, locations))

РЕДАКТИРОВАТЬ: Кроме того, вы можете поместить словарные места в отдельный файл, или вы даже можете экспортировать его в CSV или другой формат.

Чтобы усилить алгоритм, вы можете проверить, находится ли elt в туре в локациях. Кроме того, вы должны использовать tour [i] .lower (), чтобы избавиться от заглавных букв.

0
Mathieu 31 Авг 2017 в 13:38

Вы перебираете места, поэтому туры в порядке, как в списке мест. Я советую вам превращать местоположения в словарь, выглядящий как {"ngv": (4,0), ..} строка изменения объявления tour_list = [i for i in locations if i[0] in tour] в

tour_list = [i for i in tour if i in locations.keys()]

Но вы можете сделать свой код намного лучше. Словарь здесь очень полезен

0
puf 31 Авг 2017 в 13:25