for循环保存到数组但跳过保存元素

时间:2017-07-26 16:23:21

标签: python python-3.x

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

我想做的o​​neliner是:

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,...]或者某个排序

2 个答案:

答案 0 :(得分:5)

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

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

使用i%n对其进行概括,以便每当索引可以被n整除时,i%n==0bar(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) ]