2016-04-26 7 views
1

Ich habe die folgende Funktion, die ich gemacht habe, die Anmeldedatum eines Mitglieds und die Länge ihres Vertrags dauert und gibt einen geänderten Datenrahmen mit einem Ablaufdatum für jedes Mitglied zurück. Die Funktion funktioniert wie vorgesehen, aber ich wollte wissen, ob es eine sauberere Möglichkeit gibt, die verschachtelte Funktion month_to_num(ind) zu schreiben. Ich weiß, Python implementiert cases nicht, aber gibt es eine Möglichkeit, die alle if/elif/else Aussagen umschreiben?Switch-Fall wie Struktur in Python

def renewal_date(df): 

    def month_to_num(ind): 
     if (df.loc[ind, "Contract Type"] == "1 Month"): 
      return 1 
     elif (df.loc[ind, "Contract Type"] == "3 Months Prom" or 
       df.loc[ind, "Contract Type"] == "3 Month"): 
      return 3 
     elif (df.loc[ind, "Contract Type"] == "4 Month Promo"): 
      return 4 
     elif (df.loc[ind, "Contract Type"] == "6 Months"): 
      return 6 
     else: 
      return 12 

    for z in range(0, len(df)): 
     exp_date = (df.loc[z, "Date-Joined"] + 
        relativedelta(months=+month_to_num(z))) 
     df.set_value(z,"Date-Renewal", exp_date) 

    return df 
+1

Sie können Python-Wörterbücher normalerweise verwenden, um 'case' Anweisungen oder große' if/elif' Blöcke zu ersetzen. –

Antwort

1

Dies ist besser geeignet für die Code Review Stack Exchange, sondern Funktionalität zu erhalten, würden Sie normalerweise ein Wörterbuch verwenden:

MONTH_NUMS = { 
    '1 Month': 1, 
    '3 Months Prom': 3, 
    '3 Month': 3, 
    '4 Month Promo': 4, 
    '6 Months': 6, 
} 

def month_to_num(ind): 
    return MONTH_NUMS.get(df.loc[ind, 'Contract Type'], 12) 

Das heißt, es ist ein bisschen wie ein Code Geruch hier, wie wir sind Zuordnen von Strings zu Zahlen auf diese Weise.

+0

Danke, mir war nicht bewusst, dass es einen Ort gab – Lukasz

1

Sie können ein Dictionary in Koordination mit der dict.get() Methode verwenden, die einen Standardwert zurückgibt, wenn der Schlüssel nicht im Wörterbuch vorhanden ist.

def renewal_date(df): 
    def month_to_num(ind): 
     contract_types = {'1 Month': 1, '3 Months Prom': 3, '4 Month Promo': 4, '6 Months': 6} 

     return contract_types.get(df.loc[ind, "Contract Type"], 12) 

    for z in range(0, len(df)): 
     exp_date = (df.loc[z, "Date-Joined"] + 
        relativedelta(months=+month_to_num(z))) 
     df.set_value(z, "Date-Renewal", exp_date) 

    return df