доступ к словарю с элементом из словаря - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь получить доступ к словарю в Python. У меня есть список, содержащий коды аэропортов, и для каждого кода я хочу использовать этот код для ввода в свой словарь и получения информации об аэропорте, находящейся в airportDict, из класса моего аэропорта

    for i in range(len(itinerary) - 1):
         a1 = Airport.airportDict.get(itinerary[i])

Я использовал что-то подобное ранее в своем коде для создания взвешенного ориентированного графа.

    graph = {}
    for i in range(len(airportInput)):
         graph[airportInput[i]] = {}
         a1 = Airport.airportDict.get(airportInput[i])

это работало нормально, но в приведенном выше я получаю ошибку TypeError: unhashable type: 'list'

В указанном выше случае ввод аэропорта также является списком и был объявлен как таковой

    airportInput = [row[0], row[1], row [2], row[3], row[4]]

Просто для пояснения, это основная функция, которую я пытаюсь использовать

     def shortestPath (row):

        airportInput = [row[0], row[1], row [2], row[3], row[4]]
        aircraftInput = row[5]
        graph = createGraph(airportInput, aircraftInput)
        airportsToVisit = [row[1], row [2], row[3], row[4]]
        originAirport = [row[0]]
        iteneries = permute(airportsToVisit)
        for perm in iteneries:
           #perm.insert(0, originAirport)
           perm.extend([originAirport, perm[0]])
           print(perm)
           print(cost(perm, aircraftInput))

моя функция перестановки

   def permute(destinationList): 
      permutationTuples = permutations(destinationList) 
      return list([list(_) for _ in permutationTuples])

и стоимость

  def cost(itinerary, aircraft):
     air = Aircraft.airplaneDict.get(aircraft)
     if air.units == 'imperial':
         fuelCapacity = float(air.range) * 1.60934
     else:
         fuelCapacity =float(air.range)
     distanceList = []
     for i in range(len(itinerary) - 1):
         a1 = Airport.airportDict.get(itinerary[i])
         country = a1.country
         currencyCode = CurrencyCode.currencyCodeDict.get(country).currencyCode
         toEuroRate = float(currencyRate.currencyRateDict.get(currencyCode).toEuroRate)
         lat1 = a1.lat
         long1 = a1.long
         a2 = Airport.airportDict.get(itinerary[i])
         country = a2.country          
         lat2 = a2.lat
         long2 = a2.long
         distance = greatcircledist(long1, lat1, long2, lat2)
         if distance > fuelCapacity:
             return none
         else:
             distance *= toEuroRate
        distanceList.append(distance)
     return sum(distanceList) 

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

@ rhanly, что печатает (Пермь) печатать?

@ palivek ['LHR', 'SYD', 'JFK', 'AAL', ['DUB'], 'LHR']

Вот твоя проблема. Если i == 4, то itinerary[i] == ['DUB']. ['DUB'] - это список, который не является допустимым ключом словаря, потому что он изменчив.

0 голосов
/ 26 апреля 2018

Похоже, вы пытаетесь использовать список в качестве ключа к словарю.

airportInput = [row[0], row[1], row [2], row[3], row[4]]

Ошибка, вероятно, здесь graph[airportInput[0]], а также здесь a1 = Airport.airportDict.get(airportInput[0])

Вы фактически пытаетесь сделать, graph(row[0])

Ошибка предполагает, что row[0] имеет тип List?

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

Кроме того, знаете ли вы о сращиваниях ... вы можете airportInput = row[0:5]. Если вы еще этого не сделали, возможно, найдите время, чтобы пройти последний учебник по Python Учебник по Python 3 или Учебник по Python 2 . Это не займет много времени, но действительно должно помочь вам.

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

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