2016-04-26 67 views
1

我有以下函數,它取得了成員的登錄日期和合約長度,併爲每個成員返回一個帶有到期日期的修改後的數據框。該函數按預期工作,但我想知道是否有更清晰的方式來編寫嵌套函數month_to_num(ind)。我知道python不實現cases,但有沒有辦法重寫所有的if/elif/else陳述?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

您通常可以使用python字典來替換'case'語句或大的if/elif'塊。 –

回答

1

這是更適合Code Review Stack Exchange,而是維護功能,你通常使用的字典:

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) 

這就是說,有一個在我們如何都有點這裏代碼味道的以這種方式將字符串映射到數字

+0

謝謝,我不知道這個地方存在 – Lukasz

1

您可以使用一個與dict.get()方法協調的字典,如果該字詞不存在於該字典中,它將返回一個默認值。

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