2017-08-17 9 views
0

これはPythonでより短い方法がありますか?辞書の作成python2.7このバイトを解析する方法を短くする

を使用して

 if byte is 1: 
      return 0 
     if byte is 2: 
      return 1 
     if byte is 4: 
      return 2 
     if byte is 8: 
      return 3 
     if byte is 64: 
      return 4 
     if byte is 128: 
      return 5 

イムは、数学的な方法があるが、可能ですが、まだかなり長いですか?おかげさまで

+1

を持っているすべてのすべて、その後、bがあなたの入力バイトであるlg(b)、で示さ、対数の底2(上記のようにそれ以外の変換)があると仮定すると、入力を出力にマップしますか? – Barmar

答えて

1

詳細

あなたは非辞書ソリューションを主張した場合、あなたは対数ベース2と、次のようにいくつかのブール演算を使用することができます。

まず、あなたの入力バイトbから対数の底2を得る(いくつかの言語でlg(b)を表すが、私はPythonianを知らない、とlogの用心:ほとんどの言語では、これは対数ベース10を表します)。

あなたの言語でこのような関数が存在しない場合は、次のように変換するために自然対数を使用してください:n=ln(b)/ln(2)bについて次のnを得る:

b n 

1 0 
2 1 
4 2 
8 3 
64 6 
128 7 

この中間結果nでは、いくつかのブール演算を適用します。

n  a=  b= c= r= 
= bin nAND4 a>>1 bXOR7 nANDc dec 
0 000 000 000 111 000 0 
1 001 000 000 111 001 1 
2 010 000 000 111 010 2 
3 011 000 000 111 011 3 
6 110 100 010 101 100 4 
7 111 100 010 101 101 5 

あなたはPythonianにこれを翻訳する必要があります。ここにあなたがこの

結果その辞書についてどのように

r = ((((lg(b)) And 4) >> 1) Xor 7) And lg(b) 
2

辞書を使用していますか?

options = { 
    1: 0, 
    2: 1, 
    4: 2, 
    8: 3, 
    64: 4, 
    128: 5 
} 
def get_value(x): 
    return options.get(x, default_val) 
3

キーとしてbyteの可能な値からなる各キーと値のペア、および値として対応する結果とdictionaryを作成します。

result = { 
    1: 0, 
    2: 1, 
    4: 2, 
    8: 3, 
    64: 4, 
    128: 5 
}[byte] 

byteが辞書にない値を持っている場合は、このソリューションは、例外がスローされますのでご注意ください。

result = { 
    1: 0, 
    2: 1, 
    4: 2, 
    8: 3, 
    64: 4, 
    128: 5 
}.get(byte, -1) 

byteは、キーのいずれかでない場合、これは-1の結果が得られます:あなたは少しだけ異なる値をチェックするためにそれを修正する必要があります。

+0

@haccks以前のバージョン? – stybl

+0

気にしないでください。最初の編集の前に投稿したライナーについて話していました。 – haccks

1
byte_dict = {'1':0, '2':1, '4':2, '8':3, '64':4, '128':5} 
return byte_dict[str(byte)] 
関連する問題