2016-06-05 5 views
0

Ich mag würde wissen, ob es eine „pythonic“ Art und Weise ist das mathematische argmin/argmax für eine Memberfunktion ohne mit Bibliothek wie numpy zu verwenden.Python - argmin/argmax für Memberfunktion

Ich habe eine Klasse mit einer Mitgliedsfunktion innerhalb der eine ganze Zahl zurückgibt. Ich instanziiere mehrere Objekte dieser Klasse. Ich möchte wissen, welches Objekt den niedrigeren Rückgabewert für diese Methode hat.

Hier finden Sie meinen Quellcode. Der Teil, den ich verbessern möchte, ist nur nach dem Tag Code, den ich gerne verbessern würde. Dieser Code funktioniert sehr gut, aber ich bin mir ziemlich sicher, dass es einen besseren Weg gibt, dasselbe zu tun. Hier

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
"""argmin example""" 


class People(object): 
    """People class""" 
    ret_ages = {"Half": 60, "AlmostFull": 65, "Full": 71} # years 

    def __init__(self, name, age, ret_mode): 
     super(People, self).__init__() 

     if ret_mode not in self.ret_ages.keys(): 
      raise KeyError(ret_mode + " not in " + str(self.ret_ages.keys())) 

     self.name = name 
     self.age = age 
     self.ret_mode = ret_mode 

    def get_remaining_years(self): 
     """ 
       Return how many years People have still to work before earning 
       <rate> retirement. 
       <rate> could be "Half", "Middle" or "Full". 
     """ 
     try: 
      return self.ret_ages[self.ret_mode] - self.age 
     except KeyError: 
      raise KeyError("rate has to be in " + str(self.ret_ages.keys())) 


def main(): 
    """Main function""" 
    people_list = [ 
     People("Juliette", 35, "Full"), 
     People("Coralie", 26, "Half"), 
     People("Laura", 27, "AlmostFull") 
    ] 

    # Debugging print 
    for people in people_list: 
     print people.name, "has still to work",\ 
      people.get_remaining_years(), "years." 
    print 
    # End of debugging print 

    ############################ 
    # Code I'd like to improve # 
    ############################ 

    people_closer_to_ret = people_list[0] 
    minimum_remainining_years = people_closer_to_ret.get_remaining_years() 

    for people in people_list: 
     if people.get_remaining_years() < minimum_remainining_years: 
      people_closer_to_ret = people 
      minimum_remainining_years = people.get_remaining_years() 

      minimum_remainining_years = people.get_remaining_years() 

    ################################### 
    # End of code I'd like to improve # 
    ################################### 

    print people_closer_to_ret.name, "will be retired soon !" 


if __name__ == '__main__': 
    main() 

ist die Ausgabe dieses Skripts:

Juliette has still to work 36 years. 
Coralie has still to work 34 years. 
Laura has still to work 38 years. 

Coralie will be retired soon ! 

Antwort

1

Ein guter Weg, diesen Code in einer pythonic Art und Weise zu schreiben ist min Funktion zu verwenden, die tatsächlich verwendet werden können, wie argmin Funktion dank seines Parameters Schlüssel.

Wenn wir den Code zwischen dem Tag -Code ersetzen Ich mag würde und Ende des Codes verbessern Ich möchte zur Verbesserung von:

people_closer_to_ret = min(people_list, 
          key=lambda people: people.get_remaining_years()), 

es perfekt funktioniert. Das Schlüssel Argument ist nützlich, um der min Funktion zu erklären, welches Kriterium es zu minimieren hat.

So Ihre vollständige Code ist folgende:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
"""argmin example""" 


class People(object): 
    """People class""" 
    ret_ages = {"Half": 60, "AlmostFull": 65, "Full": 71} # years 

    def __init__(self, name, age, ret_mode): 
     super(People, self).__init__() 

     if ret_mode not in self.ret_ages.keys(): 
      raise KeyError(ret_mode + " not in " + str(self.ret_ages.keys())) 

     self.name = name 
     self.age = age 
     self.ret_mode = ret_mode 

    def get_remaining_years(self): 
     """ 
       Return how many years People have still to work before earning 
       <rate> retirement. 
       <rate> could be "Half", "Middle" or "Full". 
     """ 
     try: 
      return self.ret_ages[self.ret_mode] - self.age 
     except KeyError: 
      raise KeyError("rate has to be in " + str(self.ret_ages.keys())) 


def main(): 
    """Main function""" 
    people_list = [ 
     People("Juliette", 35, "Full"), 
     People("Coralie", 26, "Half"), 
     People("Laura", 27, "AlmostFull") 
    ] 

    # Debugging print 
    for people in people_list: 
     print people.name, "has still to work",\ 
      people.get_remaining_years(), "years." 
    print 
    # End of debugging print 

    people_closer_to_ret = min(people_list, 
           key=lambda people: people.get_remaining_years()) 

    print people_closer_to_ret.name, "will be retired soon !" 


if __name__ == '__main__': 
    main()