Need help sorting list of objects by key.  
I am unable to get this code to sort a list of objects using either .sort() or sorted().  What am I missing here?

P.S. My solution.distance() method could use some cosmetic surgery too if anyone has any suggestions.  

Thanks!


    import random
    import math
    
    POPULATION_SIZE = 100
    
    data = [[1, 565.0, 575.0],
    		[2, 25.0, 185.0],
    		[3, 345.0, 750.0],
    		[4, 945.0, 685.0],
    		[5, 845.0, 655.0],
    		[6, 880.0, 660.0],
    		[7, 25.0, 230.0],
    		[8, 525.0, 1000.0],
    		[9, 580.0, 1175.0],
    		[10, 650.0, 1130.0]
    		]
       
    class Solution():
      
      def __init__(self):
        self.dna = []
        self.randomize()
        
      def randomize(self):
        temp = data[:]
        while len(temp) > 0:
          self.dna.append( temp.pop( random.randint( 0,len(temp)-1 ) ) ) 
          
      def distance(self): 
        total = 0 
        #There has to be a better way to access two adjacent elements.
        for i, points in enumerate(self.dna):
          if i < (len(self.dna)-1): 
            total += math.sqrt( (points[1]-self.dna[i+1][1])**2 + (points[2]-self.dna[i+1][2])**2 )
          else:
            total += math.sqrt( (points[1]-self.dna[0][1])**2 + (points[2]-self.dna[0][2])**2 )
        return int(total)
        
    
    class Population():
    
      def __init__(self):
        self.solutions = []
        self.generation = 0
        
        #Populate with solutions
        self.solutions = [Solution() for i in range(POPULATION_SIZE)]
            
        
      def __str__(self):
        
        result = ''
        
        #This is the part that is not returning sorted results.  I tried sorted() too.
        self.solutions.sort(key=lambda solution: solution.distance, reverse=True)
       
        
        for solution in self.solutions:
          result += 'ID: %s - Distance: %s\n' % ( id(solution),  solution.distance() )
       
        return result
     
     
    if __name__ == '__main__':
    
      p = Population()
      print p
      
    
      
Need help sorting list of objects by key.  
===

I am unable to get this code to sort a list of objects using either .sort() or sorted().  What am I missing here?

P.S. My solution.distance() method could use some cosmetic surgery too if anyone has any suggestions.  

Thanks!


    import random
    import math
    
    POPULATION_SIZE = 100
    
    data = [[1, 565.0, 575.0],
    		[2, 25.0, 185.0],
    		[3, 345.0, 750.0],
    		[4, 945.0, 685.0],
    		[5, 845.0, 655.0],
    		[6, 880.0, 660.0],
    		[7, 25.0, 230.0],
    		[8, 525.0, 1000.0],
    		[9, 580.0, 1175.0],
    		[10, 650.0, 1130.0]
    		]
       
    class Solution():
      
      def __init__(self):
        self.dna = []
        self.randomize()
        
      def randomize(self):
        temp = data[:]
        while len(temp) > 0:
          self.dna.append( temp.pop( random.randint( 0,len(temp)-1 ) ) ) 
          
      def distance(self): 
        total = 0 
        #There has to be a better way to access two adjacent elements.
        for i, points in enumerate(self.dna):
          if i < (len(self.dna)-1): 
            total += math.sqrt( (points[1]-self.dna[i+1][1])**2 + (points[2]-self.dna[i+1][2])**2 )
          else:
            total += math.sqrt( (points[1]-self.dna[0][1])**2 + (points[2]-self.dna[0][2])**2 )
        return int(total)
        
    
    class Population():
    
      def __init__(self):
        self.solutions = []
        self.generation = 0
        
        #Populate with solutions
        self.solutions = [Solution() for i in range(POPULATION_SIZE)]
            
        
      def __str__(self):
        
        result = ''
        
        #This is the part that is not returning sorted results.  I tried sorted() too.
        self.solutions.sort(key=lambda solution: solution.distance, reverse=True)
       
        
        for solution in self.solutions:
          result += 'ID: %s - Distance: %s\n' % ( id(solution),  solution.distance() )
       
        return result
     
     
    if __name__ == '__main__':
    
      p = Population()
      print p
      
    
      