基本上,我想要一个花哨的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) ]