2016-05-05 4 views
0

こちらは新品、プログラミングには全く新しいものです。私はPythonで化学や物理によく見られる大きなUV-Vis吸光度データをまとめたり圧縮したりするプログラムを書いています。セクションをもっと「Pythonic」にすることで、プログラムに最終的なタッチを追加しようとしています。次のスニペットはそのような例の1つです。大きな "if-else"ツリーアルゴリズムの代わりに?

while j < (N): 
    j=j+1 
    B=A[1+(10*j)+R][1:k] #Extraction expression. 
    C=[float(i) for i in B] #Float conversion. 
    D[0].append(C[0]),D[1].append(C[1]),D[2].append(C[2]) 
    if NC >= 4: 
     D[3].append(C[3]) 
     if NC >= 5: 
      D[4].append(C[4]) 
      if NC >= 6: 
       D[5].append(C[5]) 
       if NC >= 7: 
        D[6].append(C[6]) 
        if NC >= 8: 
         D[7].append(C[7]) 
         if NC >= 9: 
          D[8].append(C[8]) 
          if NC >= 10: 
           D[9].append(C[9]) 
           if NC >= 11: 
            D[10].append(C[10]) 
            if NC == 12: 
             D[11].append(C[11]) 

Cはネストされたリストです。私はC内のリストに含まれるインデックス固有の要素を追加しようとしています。

Ie. C = [[A1、B1、C1]、[A2、B2、C2]、[A3、B3、C3]、...] →[A1、A2、A3、... An]、[B1 ..B2、B3、... Bn] ...

NCがあるインデックスNと同等である場合、ネストされたリストのインデックスは同じインデックスであり、追加アルゴリズムは異なるNCの各値。

上記のスニペットは私の目的には完全に機能しますが、プログラムが進化するにつれて、長さと重複コードは長期的には実現できません。

誰かが私を正しい方向に向けることができますか?

乾杯

答えて

3

まず、ネストする必要はありません。 NC >= xの場合は、>= x - 1となることもわかります。それは、あなたがこのように見えるためにあなたの木を「フラット化」することができます意味:

while j < (N): 
    j=j+1 
    B=A[1+(10*j)+R][1:k] #Extraction expression. 
    C=[float(i) for i in B] #Float conversion. 
    D[0].append(C[0]),D[1].append(C[1]),D[2].append(C[2]) 
    if NC >= 4: 
     D[3].append(C[3]) 
    if NC >= 5: 
     D[4].append(C[4]) 
    if NC >= 6: 
     D[5].append(C[5]) 
    if NC >= 7: 
     D[6].append(C[6]) 
    if NC >= 8: 
     D[7].append(C[7]) 
    if NC >= 9: 
     D[8].append(C[8]) 
    if NC >= 10: 
     D[9].append(C[9]) 
    if NC >= 11: 
     D[10].append(C[10]) 
    if NC == 12: 
     D[11].append(C[11]) 

今、あなたはわずかに異なる値で何度も何度も同じことをやっているどのような状況で、あなたはループを使用することができます

while j < (N): 
    j=j+1 
    B=A[1+(10*j)+R][1:k] #Extraction expression. 
    C=[float(i) for i in B] #Float conversion. 
    D[0].append(C[0]),D[1].append(C[1]),D[2].append(C[2]) 
    for i in range(4, 12): 
     if NC >= i: 
      D[i - 1].append(C[i - 1]) 
    if NC == 12: 
     D[11].append(C[11]) 

編集:これはあなたの目的のために働いているとお伝えしましたが、NC > 12の場合はどうなるのか注意してください。つまり、まではD[11]までのすべてに追加されます。それがあなたが望むものなら、あなたは金色です。その最後の比較は本当に>=ではなく==ことになっている場合でも、あなたはもちろん、ちょうど最後にその余分if NC == 12なければ

for i in range(4, 13): 
     if NC >= i: 
      D[i - 1].append(C[i - 1]) 

としてプログラムを書くことができます。

+1

はい、完璧に動作し、私はあなたが何をしたかを見ます。基本的に私たちが使用している分光光度計は12×8のマイクロプレートを読み取るので、NCは実際には12を横断しません。しかし、あなたの編集は実際には、私は12で8より大きい次元を持っているマイクロプレートがあることを認識しています。思考のための食べ物! – David

+0

私は助けることができて非常にうれしい! – Hamms

-1

よりもむしろ場合はネストされた機能の負荷を使用して、値が> = 4である一方で、各ターンにwhileループを使用し、NC値を下げるが:

import math 
NC_floor = int(math.floor(NC)) 

while NC_floor >= 4: 
    NC_floor -= 1 
    D[NC_floor].append(NC_floor) 
0

まず、各反復では、あなたが追加しています値をDの範囲に設定します。範囲をifステートメントのはしごとしてハードコーディングする代わりに、適切な量だけループすることができます。それはxrange(max(3, min(12, NC)))ですが、NC <= 12と仮定すると、これはさらに簡単にxrange(max(3, NC))に簡略化することができます。

第2に、ABに変換し、次にCに変換する作業がたくさんありますが、各値を1回使用します。代わりに、値が使用されている場所に計算を折りたたむだけです。

第三に、あなたはjを初期化しませんが、それは0から始まると仮定すると、while j < Nループはforループに単純化することができます。

のことをまとめる:[注:テストされていないので、オフずつ誤差が残留することができる]

for j in xrange(1, N+1): 
    for i in xrange(max(3, min(12, NC))): 
     D[i].append(float(A[2 + 10*j + R]) 

を。

関連する問題