2016-11-06 2 views
1

У меня есть словарь под названием «местоположения». Функция, которую я пишу для словаря, настроена в формате (d, description, current), где «d» ссылается на словарь, «описание» ссылается на строку, описывающую местоположение, которое мы ищем, и «текущие» ссылки на то мы в настоящее время находимся в словаре как пара координат (x, y).Навигация по словарю в Python

В принципе, каждое местоположение имеет несколько позиций в словаре, каждый со своей собственной координатой, и моя цель - найти ближайшую позицию к тому, где мы сейчас находимся в словаре (текущем). Стратегия заключается в использовании формулы расстояния для ее расчета.

Например, если бы мы искали ближайшую заправочную станцию, и мы были в состоянии (2,2), функция должна была возвращать (3,1) для ближайшей станции, если две станции находились в (3,1) и (1,4), поскольку (3,1) ближе к (2,2). Любые рекомендации по моему текущему коду будут оценены.

Код:

def closest(d, description, current): 
    current_location = (x, y) 
    d = {(3,1):'gas', (1,4):'gas', (2,1):'food', (5,5):'food'} 
    distancesFromCurrent = [distanceFormula(z, current_location) for z in places] 
    for z in d: 
    if z < minimum float: 
     return z 

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

+0

не дают переменные одноименные функции .. – Olian04

+0

Спасибо за указание, что из просто фик его – n00bprogrammer22

+0

я хочу добавить, я думаю, что проблема определения местоположения ближайшего местоположения. Как-то я думаю, что я должен использовать строку описания, чтобы найти ее, но не знаю, как это будет сделано. – n00bprogrammer22

ответ

1

После рассмотрения комментариев, вот мое решение.

#!/usr/bin/env python2 
# -*- coding: utf-8 -*- 
""" 
Created on Sun Nov 6 21:42:22 2016 

@author: michaelcurrin 
""" 

import math 

def findDistance(A, B): 
    """ 
    In 2D space find the distance between two co-orinates is 
    known as Eucliciean distance. 
    Args 
     A: tuple or list of x and y co-ordinates 
      e.g. (1,2) e.g. [1,2] 
     B: as A. 
    Retuns 
     distance: float. Decimal value for shortest between A and B 
    """ 
    x = (A[0] - B[0]) 
    y = (A[1] - B[1]) 
    distance = math.sqrt(x**2 + y**2) # square root 

    # remove comment if you want to see this outputted 
    # print distance 

    return distance 


def GetClosestPlace(places, loc, feature): 
    """find shortest distance between current location and each locations 
    but only ones which have the desired feature""" 

    # add distance from current location to each location 
    for index in range(len(places)): 

     # only continue if feature exists at place 
     if feature in places[index]['features']: 

      # calculate 
      distance = findDistance(loc, 
            places[index]['location']) 
     else: 
      # this is to represent n/a for now as every location needs a distance 
      # for this version, so that it will not be chosen 
      distance = 1000 

      # add calculated distance to existing dictionary for location 
     places[index]['distance'] = distance  


    # find shortest distance and return details for that place 

    allDistances = [x['distance'] for x in places] 
    shortestDistance = min(allDistances) 

    for place in places: 
     if place['distance'] == shortestDistance: 
      return place 


placesList = [dict(name='foo',location=(0,3), features=['gas', 'food']), 
       dict(name='bar',location=(4,6), features=['food', 'hospital']), 
       dict(name='abc',location=(0,9), features=['gas','barber']), 
       dict(name='xyz',location=(2,2), features=['food','barber']) 
       ] 

currentLocation = (5,9) 
desiredFeature='food' 

closestPlace = GetClosestPlace(placesList, currentLocation, desiredFeature) 

print 'Current location: %s' % str(currentLocation) 
print 'Desired feature: %s ' % desiredFeature 
print 
print 'The closest place is...' 
print 'Name: %s' % closestPlace['name'] 
print 'Location %s' % str(closestPlace['location']) 
print 'Distance %f' % closestPlace['distance'] 
# join multiple features in the list with commas 
print 'Features: %s' % ', '.join(closestPlace['features']) 

""" 
OUTPUT 

Current location: (5, 9) 
Desired feature: food 

The closest place is... 
Name: bar 
Location (4, 6) 
Distance 3.162278 
Features: food, hospital 
""" 
+0

В моей второй версии выше я исправил недостаток функций и улучшил форматирование вывода. Плюс я добавил еще один пример для мест. – MikeCPT

+0

Вы оказали огромную помощь, я дал вам лучший ответ. Сейчас я получаю одну ошибку, и я не уверен, почему. Он говорит: строка 45, в GetClosestPlace , если функция в d [index] ['features']: KeyError: 0. Я не уверен, что вызывает ключевую ошибку – n00bprogrammer22

+0

Возможно, потому что вы на Python 3.x и Мне 2.7? Это повлияет на работу первой строки, операторов печати и, может быть, линии, вы получаете ошибку? – MikeCPT

0

Я думаю, вам нужно использовать ввод словаря для вычисления результатов для географических названий на расстоянии от текущего местоположения в виде одного поплавка (или десятичного).

Что-то вроде

current_location = (x, y) 
distancesFromCurrent = [distanceFormula(z, current_location) for z in places] 

Где distanceFormula будет использовать вас расстояние известково в функции.

После того, как вы едите, что для всех места введено, то вы можете сделать еще один цикл найти минимального значение поплавка в словаре и возвращает соответствующее название места и его координатное место (от исходного входа).

Я думаю, вы можете перейти от словаря к списку ввода, чтобы быть в этом формате ниже. (Если у вас есть что-нибудь данные, как это уже, чтобы показать нам, что помогло бы тоже)

placesList = [dict(name='abc',location=(0,3), features=['gas station','mall', 'police dept', 'fire dept']), 
       dict(name='xyz',location=(4,5), features=['police dept', 'hospital']), 
      #etc. 
      ] 

Тогда ваша функции бы найти ближайшее место, но первый отфильтровывать места, которые имеют функцию, которая соответствует вашему описанию.

Надеюсь, что это поможет.

+0

Я все еще очень смущен. Является ли z равным строке описания? Будет ли ближайшее местоположение всегда иметь минимальное значение поплавка? Как именно я хотел бы найти минимальное значение поплавка для местоположения с конкретным описанием? Вот то, что ищет один из тестовых примеров, если это полезно в объяснении: ближайший ({(3,1): «газ», (1,4): «газ», (2,1): «еда», , (5,5): «еда»}, «еда», (1,4)) == (2,1). – n00bprogrammer22

+0

Я использовал z в качестве координаты, например. (1,4), а не как описание. – MikeCPT

+0

О, я думал, что названия мест были городами и городами. Означает ли это вообще как ярлык для пользователя или оно только координируется против службы при координации? – MikeCPT