2

この質問は以前にもあったかもしれませんが、見つけられませんでした。特定の値がどの範囲にあるかを決定する何かを実装しようとしています。この例では、x は任意の実数です。

def f(x):
    if x < 0.1:
        do_something_1()
    elif 0.1 <= x < 1:
        do_something_2()
    elif 1 <= x < 10:
        do_something_3()
    elif x >= 10:
        do_something_4()

…お分かりですね。

Python で switch ステートメントを置き換える辞書の例をたくさん見てきましたが、辞書は離散値にインデックスを付けるものとして常に理解していました。

この状況では、if-elif-else チェーンが最善の解決策であるとは信じがたいです。誰かがより良いものを知っていますか?

4

3 に答える 3

12

これを改善する簡単な方法は、下限を繰り返さないことです。あなたのコードはと同等です

if x < 0.1:
    do_something_1()
elif x < 1:
    do_something_2()
elif x < 10:
    do_something_3()
else:
    do_something_4()

値が本当に多い場合は、bisect代わりに使用することをお勧めしますが、オプションが4つしかない場合は、少なくとも読みやすさと速度の点で、上記のコードがおそらく最良の解決策です。

于 2012-07-19T15:18:01.830 に答える
9

bisectパッケージを使用して、値が存在するインデックスを見つけてから、適切な関数を呼び出します。あなたの例では:

import bisect

def f(x):
    funcs = [do_something_1, do_something_2, do_something_3, do_something_4]
    funcs[bisect.bisect_left([.1, 1, 10], x)]()
于 2012-07-19T15:16:40.320 に答える