1

行の長いリストを同じ変数に追加しようとしています。ループ内の最初の 1000 回程度の繰り返し (すべて同じ長さ) ではうまく機能しますが、その後、ファイルの終わり近くで行が少し短くなります。それを処理する方法がわからない。

予想どおり、スクリプトは範囲外のエラーを返します。

問題のコードの部分は次のようになります。

    ii = 0
    NNCat = []
    NNCatelogue = []
    while ii <= len(lines):

        NNCat = (ev_id[ii], nn1[ii], nn2[ii], nn3[ii], nn4[ii], nn5[ii], nn6[ii], nn7[ii], nn8[ii], nn9[ii], nn10[ii], nn11[ii])
        NNCatelogue.append(NNCat)
        ii = ii + 1



    print NNCatelogue, ii

これに関する助けがあれば大歓迎です!

4

3 に答える 3

3

最初に聞かなかった質問に答えます ;) : このコードをより Pythonic にするにはどうすればよいでしょうか?

それ以外の

ii = 0
NNCat = []
NNCatelogue = []
while ii <= len(lines):

    NNCat = (ev_id[ii], nn1[ii], nn2[ii], nn3[ii], nn4[ii], nn5[ii], nn6[ii], nn7[ii], nn8[ii], nn9[ii], nn10[ii], nn11[ii])
    NNCatelogue.append(NNCat)
    ii = ii + 1

やったほうがいい

NNCat = []
NNCatelogue = []
for ii, line in enumerate(lines):

    NNCat = (ev_id[ii], nn1[ii], nn2[ii], nn3[ii], nn4[ii], nn5[ii], nn6[ii],
             nn7[ii], nn8[ii], nn9[ii], nn10[ii], nn11[ii])
    NNCatelogue.append(NNCat)

各パスの間iiに 1 ずつインクリメントされline、現在の行になります。

短いセリフについては、2 つの選択肢があります

  • None実際の値がない場合は、特別な値 ( など) を使用して入力します
  • nn1nn2、 ...の長さをチェックしてnn11、それらが十分に大きいかどうかを確認します

2 番目の解決策は、はるかに冗長で、保守が難しく、混乱を招きます。Noneデータがない場合は、(または自分で作成した別の特別な値) をプレースホルダーとして使用することを強くお勧めします。

于 2012-10-02T15:04:32.160 に答える
1
from itertools import izip_longest
NNCatelogue = list(izip_longest(ev_id, nn1, nn2, ... nn11, fillvalue=None))

izip のドキュメントについては、こちらを参照してください。list必要がない場合は、イテレータの周りをスキップしてください。多くの場合、リストだけでなくイテレータも使用でき、多くのメモリを節約できます。特に長いリストがある場合は、ここでグループ化します。

于 2012-10-02T15:16:23.340 に答える
1
def gvop(vals,indx): #get values or padding
    return vals[indx] if indx<len(vals) else None

NNCatelogue = [(gvop(ev_id,ii), gvop(nn1,ii), gvop(nn2,ii), gvop(nn3,ii), gvop(nn4,ii),
                gvop(nn5,ii), gvop(nn6,ii), gvop(nn7,ii), gvop(nn8,ii), gvop(nn9,ii),
                gvop(nn10,ii), gvop(nn11,ii)) for ii in xrange(0, len(lines))]

この他の関数を正しい値またはパディングのいずれかを返すように定義することで、行が同じ長さになるようにすることができます。None が必要でない場合は、パディングを任意に変更できます。

次に、リスト comp は以前と同様にタプルのリストを作成しますが、入力の一部の行が短い場合にパディングを含めます。

于 2012-10-02T15:39:39.297 に答える