2016-10-08 11 views
1

数値をチェックしてそれに応じて文字列値を返すifステートメントがあります。Pythonで7つのif文を実行する最短方法

コード:

def get_weekday(day): 
    if day in ['1', 1]: 
     return 'Monday' 
    elif day in ['2', 2]: 
     return 'Tuesday' 
    elif day in ['3', 3]: 
     return 'Wednesday' 
    elif day in ['4', 4]: 
     return 'Thursday' 
    elif day in ['5', 5]: 
     return 'Friday' 
    elif day in ['6', 6]: 
     return 'Saturday' 
    elif day in ['7', 7]: 
     return 'Sunday' 
    return 'Invalid day selected' 

質問は主観的な表示されることがありますが、私はこれを書いている神託とより良いと短く、きれいな方法があるはずだと思います。

+0

なぜあなたは使用していますか? intや文字列はどうやっていますか? –

+0

@PadraicCunningham:テンプレートからDjangoから 'day'が来ています。 – Yax

+0

@ Yaxなので、djangoは別の型を返しますか? –

答えて

4

代わりに辞書を作成して、dayを1つのタイプにキャストして、辞書でそれを調べます。これはかなりあなたのコードを最小限に:あなたは、あなたが文字列またはintとしてそれを渡すかどうかは関係ありません、あなたのdayを渡しているされているので、

def get_weekday(day): 
    days_dict = { 
     '1': 'Monday', 
     '2': 'Tuesday', 
     '3': 'Wednesday', 
     '4': 'Thursday', 
     '5': 'Friday', 
     '6': 'Saturday', 
     '7': 'Sunday' 
    } 
    return days_dict.get(str(day), 'Invalid day selected') 

、上記の機能に何が起こっているのかを、鋳造が行われます既にstrとしてあなたの辞書にあなたのためのマッピングが保持され、ルックアップにはO(1)がかかります。

getメソッドは、辞書にエントリが見つからない場合はNoneを返します。ただし、お客様の要件に応じて、無効なエントリの場合はInvalid day selectedを返すようにしています。 getは無効なキーが提供された場合に返される追加の引数をとります。ここで

を考え出すことができる異なる例のデモで、関数がどのように動作するか:

>>> print(get_weekday(2)) 
Tuesday 
>>> print(get_weekday('5')) 
Friday 
>>> print(get_weekday("invalid_thing")) 
Invalid day selected 
+0

downvote?本当に?正確には何ですか? – idjaw

1

マップを使用して同じ値の複数のキーを入力するだけで、dictionaryマップを使用することができます。

次に、現在の日のキーと一致する値の辞書を尋ねるだけです。

+0

勇敢な匿名のdownvoterのコメントは何ですか? – GhostCat

+1

コード例を提供していなかったので、彼らはあなたを落としたでしょう。 – Soviut

+0

downvoteするのは愚かな理由です。説明は明確にそこにある。 – idjaw

1

一般的な解決策は次のようになります。

def get_day_name(day): 
    return { 
     '1': 'Monday', 
     '2': 'Tuesday', 
     '3': 'Wednesday', 
     '4': 'Thursday', 
     '5': 'Friday', 
     '6': 'Saturday', 
     '7': 'Sunday' 
    }.get(str(day), 'Invalid day selected') 

いくつかのことがここで行われています。

  1. を両方の文字列'2'と整数2をチェックを取り除くために、文字列にすべてを変換:str(day)
  2. 結果にすべての許可された文字列('1' - '7')からのマッピング(dict)があります
  3. のように、{...}[day]で結果を取得すると、辞書にはデフォルトの引数を受け入れるmethog getが用意されています('Invalid day selected')。

しかし、その後、再び、これらは単なる数字であるため、これは代わりに、辞書のリストを使用して単純化することができる。この場合

def get_day_name(day): 
    day = int(day) 
    days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] 

    if 1 <= day <= 7: 
     return days[day-1] 
    else: 
     return 'Invalid day selected' 

、文字列はまず整数に変換され、整数を使用してリストから値を取得します。 これはもちろん、day = 'something that isnt int'の場合は動作しません。これは処理可能な例外を発生させますが、それを処理する必要がある場合は、dictを使用したソリューションがより良くなります。

+1

コード例は良いですが、それが何をしているかについての説明を提供してください。 – Soviut

+1

'days [7] - > IndexError' days [1] - > Tuesday' –

+1

@ソビットはい、それは私が書いたときにもっと多くのテキストが必要なように感じました;) – zvone

1

辞書を使用できます。 day与えられたときに、辞書のget方法は、デフォルト'Invalid day selected'を返す辞書にありません。

days_in_week = {1: 'Monday', 2: 'Tuesday', 3: 'Wednesday', 4: 'Thursday', 5: 'Friday', 6: 'Saturday', 7: 'Sunday'} 

def func(day): 
    return days_in_week.get(int(day), 'Invalid day selected') 

intを使用して整数へのキャストは関数は、文字列と整数dayパラメータの両方を取ることができます。

-1

私はむしろget辞書の方法の代わりに、書き込み複数elifの使用します。

def get_weekday(day): 
    WEEK = {"1": "Monday", 
      "2": "Tuesday", 
      "3": "Wednesday", 
      "4": "Thursday", 
      "5": "Friday", 
      "6": "Saturday", 
      "7": "Sunday"} 
    return WEEK.get(str(day), "Invalid day selected!") 

day引数を明示的にstrに変換すると、文字列引数と整数引数の両方が確実に機能します。

+0

これはかなり前に追加されたidjawの答えと基本的に同じです。 –

関連する問題