2017-07-26 81 views
3

基本上,我想要一個花哨的oneliner,它不會讀取我正在查看的所有文件,但仍處理它們,並保存它們的一個很好的示例。for循環保存到數組,但跳過保存元素

我想這樣做的oneliner是:

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

但我想能不能每個第n行保存在。即我仍然希望它運行(用於字節位置目的),但我不想保存圖像,因爲我沒有足夠的內存。

所以,如果條(線)的輸出爲1,2,3,4,5,6,...我想它仍然在運行1,2,3,4,5,6,...,但我想返回值是[1,3,5,7,9,...]或者類似的東西。

回答

5

使用enumerate拿到指標,並用模濾波器採取一切其他線路:

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

籠統地說與i%n所以每次該指數是n然後i%n==0bar(line)整除不發進入listcomp。

enumerate作品迭代(文件句柄,發電機......),所以它的方式比使用range(len(findex))

現在更好的上面是不正確,如果你想打電話bar所有值(因爲您需要由bar生成的副作用),因爲過濾器會阻止執行。所以你必須在2遍中做到這一點,例如使用map來將你的函數應用到findex的所有項目,並且只選擇你感興趣的結果(但它保證所有的行被處理)使用相同的執行後模濾波器,但

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

會是'如果不是(我%N )爲1/n的情況?在python中爲0是真的嗎? –

+0

是的,但OP想要不時跳過一條線。當然,當'n == 2'這是模糊的:) –

+0

哦,是的,這個問題確實如此。謝謝! –

0

如果findex是標化(接受[]運營商索引),你可以試試這個方法:

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

,只是'findex'必須是可下載才能工作的。將它傳遞給一個文件句柄,它不起作用。 –