对于循环保存到数组,但跳过保存元素



基本上,我想要一个花哨的oneliner,它不会将我正在查看的所有文件都读取到内存中,但仍然处理所有文件,并保存一个很好的样本。

我想做的单行是:

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

但我希望能够不保存其中的每一行。 即,我仍然希望它运行(出于字节位置的目的(,但我不想保存图像,因为我没有足够的内存。

因此,如果 bar(line( 的输出1,2,3,4,5,6,...我希望它仍然在1,2,3,4,5,6,...上运行,但我希望返回值是[1,3,5,7,9,...]或类似的东西。

使用enumerate来获取索引,并使用模的过滤器每隔一行获取:

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

i%n概括这一点,每次索引可以被n整除时,i%n==0并且bar(line)不会发布到 listcomp 中。

enumerate适用于每个可迭代对象(文件句柄,生成器...(,因此它比使用range(len(findex))要好得多

现在,如果要对所有值调用bar,则上述内容不正确(因为您需要bar生成的副作用(,因为过滤器会阻止执行。因此,您必须分 2 次执行此操作,例如使用map将函数应用于所有findex项,并仅选择您感兴趣的结果(但它保证所有行都被处理(使用相同的模滤波器但在执行

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

如果findex是可下标的(接受带有索引[]运算符(,您可以尝试以下方式:

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

最新更新