2017-07-26 6 views
3

基本的には、私が見ているすべてのファイルを読み込むことはできませんが、それらをすべて処理して、素敵なサンプルを保存します。はループに保存しますが、要素を保存しないでください

def foo(findex): 
    return [bar(line) for line in findex] # but skip every nth term 

しかし、私はそれにすべてのn番目の行を保存しないでできるようにしたいと思います。私がやりたい

onelinerです。すなわち、私はまだ(バイト位置の目的のために)実行したいが、私はそのために十分なメモリがないので、イメージを保存したくない。

bar(行)の出力が1,2,3,4,5,6,...の場合、私はまだ1,2,3,4,5,6,...で実行したいと思いますが、戻り値は[1,3,5,7,9,...]か何かの並べ替えが必要です。

答えて

5

インデックスを取得するために使用enumerate、および他のすべての行取るように剰余を使用してフィルタ:その後、nによるので、毎回インデックスが割り切れることをi%ni%n==0bar(line)で発行されていないことを

return [bar(line) for i,line in enumerate(findex) if i%2] 

一般化をlistcompに追加します。

enumerateのための作品ごとに反復可能(ファイルハンドル、発電...)ので、上記今range(len(findex))

を使用するよりもずっといいです、あなたがbarすべて上の値を呼び出したい場合は(間違っていますフィルタが実行を妨げるため、barによって生成される副作用が必要なため)。たとえば、mapを使用して、findexのすべての項目に機能を適用し、興味のある結果のみを選択します(しかし、すべてのの行が処理されていることが保証されています)モジュロフィルタが、実行:

l = [x for i,x in enumerate(map(bar,findex)) if i%n] 
+0

それは 'でない場合(I%Nだろう) 'のために1/nの場合? Pythonでは0ですか? –

+0

はい、OPは時折1行をスキップします。もちろん、 'n == 2 'のときはあいまいです:) –

+0

ああ、はい、その質問はそう言います。ありがとう! –

0

findexは(インデックスを持つ[]オペレータを受け入れる)の添字であるならば、あなたがこの方法を試すことができます。

def foo(findex): 
    return [bar(findex[i]) for i in range (0, len(findex), 2) ] 
+0

を除いて、 'findex'はサブスクリプト化可能でなければなりません。ファイルハンドルを渡しても機能しません。 –

関連する問題