基本上,我想要一个花哨的 oneliner,它不会将我正在查看的所有文件都读入内存,但仍会处理所有文件,并保存其中的一个很好的样本。
我想做的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
产生的副作用) ,因为过滤器阻止执行。所以你必须分两次完成,例如使用 map
将你的函数应用于 findex
的所有项目并只选择你感兴趣的结果(但它保证 所有 行都被处理)使用相同的模过滤器但是在执行之后:
l = [x for i,x in enumerate(map(bar,findex)) if i%n]
关于python - for循环保存到数组但跳过保存元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45332566/