使用字典中的项目访问字典

时间:2018-04-26 14:51:56

标签: python list dictionary data-structures

我正在尝试访问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 :(得分:1)

  

@rhanly,print(perm)打印什么?

     

@ palivek [' LHR',' SYD',' JFK',' AAL',' DUB&#39 ;],' LHR']

有你的问题。如果是i == 4,那么itinerary[i] == ['DUB']['DUB']是一个列表,它不是有效的字典键,因为它是可变的。

答案 1 :(得分:0)

看起来您尝试使用列表作为字典的键。

var canvas = document.getElementById('canvas'); var ctx = canvas.getContext('2d');`

错误可能在airportInput = [row[0], row[1], row [2], row[3], row[4]],也在graph[airportInput[0]]

您正在有效地尝试,a1 = Airport.airportDict.get(airportInput[0])

错误表明graph(row[0])的类型为List?

无论哪种方式,尝试添加一些print语句,以查看在引发异常之前实际值是什么。我想你会感到惊讶。

顺便说一句,你知道拼接......你可以row[0]。如果您还没有,也许请花时间浏览最新的Python教程Python 3 TutorialPython 2 Tutorial。它不需要很长时间,但它确实可以帮到你。

希望这有帮助。