Я должен написать функцию 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.
Заранее спасибо
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)
Вместо использования списка, используйте словарь для местоположений (это более логично) с этой структурой:
- Расположение 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 (), чтобы избавиться от заглавных букв.
Вы перебираете места, поэтому туры в порядке, как в списке мест. Я советую вам превращать местоположения в словарь, выглядящий как {"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()]
Но вы можете сделать свой код намного лучше. Словарь здесь очень полезен
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.