2017-03-24 19 views
1

私はこのコードをあまり大きくない形式に変換しようとしていますが、辞書を使用してifを削除できますが、それが等しい場合にのみ実行されます。代わりにする必要があります。 次のように私のコードは次のとおりです。複数のIfを不等式条件で削除する

def dispersion(x): 
    v = float(x)/100 
    if v <= -.20: 
    return '< -20%' 
    elif -.20 < v <= -.10: 
    return '-20% to -10%' 
    elif -.10 < v <= -0.05: 
    return '-10% to -5%' 
    elif -.05 < v <= .0: 
    return '-5% to 0%' 
    elif 0 < v <= .05: 
    return '0% to 5%' 
    elif .05 < v <= .10: 
    return '5% to 10%' 
    elif .10 < v <= .20: 
    return '10% to 20%' 
    else: 
    return '> 20%' 

私はバイナリ検索を使用して考えていたP.S-が、コードに処方することができません。

答えて

3

bisect(バイナリ検索を使用して順序付きリストに挿入インデックスを返します)、エッジケースを調整した後、作業コードは次のようになります(100で除算する必要はありません。整数、それは)表示のために簡単です:

import bisect 

def dispersion(x): 
    values = [-20,-10,-5,0,5,10,20] 
    i = bisect.bisect(values,x) 
    if i==0: 
     return '< {}%'.format(values[0]) 
    elif i==len(values): 
     return '>= {}%'.format(values[-1]) 
    else: 
     return '{}% to {}%'.format(values[i-1],values[i]) 

-50,50の範囲内のことをテスト:

for i in range(-50,50,10): 
    print(i,dispersion(i)) 

結果:

-50 < -20% 
-40 < -20% 
-30 < -20% 
-20 -20% to -10% 
-10 -10% to -5% 
0 0% to 5% 
10 10% to 20% 
20 >= 20% 
30 >= 20% 
40 >= 20% 
0

おそらく、このようなものをお探しですか?

DEF分散液(X):彼らはちょっとしなければならない他の文字列から十分に異なるで リターン< -20> 20ための '< -20%'

lowerBound = 20 
    for upperBound in [-10, -5, 0, 5, 10, 20]: 
    if lowerBound < x <= upperBound: 
     return str(lowerBound) + "% to " + str(upperBound) + "%" 
    upperBound = lowerBound 

    return '> 20%' 

列: -20 < X場合彼ら自身の状態をチェックしてください。他のものは確かにある範囲でチェックすることができます。

いくつかのメモ:

浮動小数点に変換する本当の理由はありますか?最初の整数xを比較すれば十分です。 (別のタイプの場合は、intにキャストします)。

ifの声明から返されているため、elifelseを行う必要はありません。これは機能的に同じである:あなたの元のコードがあったバージョンよりも読みするクリーンかつ容易になるかのように

if condition1: 
    return 1 
if condition2: # equivalent to `elif condition2` 
    return 2 
if condition3: # equivalent to `elif condition3` 
    return 3 
return other # equivalent to `else` 

elifelseとフロート変換を除去した後、私は感じています。しかし、それは主観的です。