基本上,我想要一个花哨的oneliner,它不会将我正在查看的所有文件都读入内存,但仍会处理它们,并保存了一个很好的样本。
我想做的oneliner是:
def foo(findex):
return [bar(line) for line in findex] # but skip every nth term
但我希望能够不保存每一行。即,我仍然希望它运行(用于字节位置),但我不想保存图像,因为我没有足够的内存。
所以,如果bar(行)的输出是1,2,3,4,5,6,...
,我希望它仍然可以在1,2,3,4,5,6,...
上运行,但我希望返回值为[1,3,5,7,9,...]
或者某个排序
答案 0 :(得分:5)
使用enumerate
来获取索引,使用模数的过滤器来获取每一行:
return [bar(line) for i,line in enumerate(findex) if i%2]
使用i%n
对其进行概括,以便每当索引可以被n
整除时,i%n==0
和bar(line)
就不会发布到listcomp中。
enumerate
适用于每个 iterable(文件句柄,生成器...),因此它比使用range(len(findex))
如果您想在所有值上调用bar
(因为您需要bar
生成的副作用),上面的内容不正确,因为过滤器会阻止执行。因此,您必须在2次传递中执行此操作,例如使用map
将您的函数应用于findex
的所有项目,并仅选择您感兴趣的结果(但它保证使用相同的模数过滤器处理所有行),但执行后:
l = [x for i,x in enumerate(map(bar,findex)) if i%n]
答案 1 :(得分:0)
如果findex
是可订阅的(接受带有索引的[]
运营商),您可以尝试这种方式:
def foo(findex):
return [bar(findex[i]) for i in range (0, len(findex), 2) ]