more_itertools
有几个lookahead tools的一个特例。这里我们将演示一些用于处理文件行的工具和抽象函数。鉴于:
f = """\
A
B
C
0
D\
"""
lines = f.splitlines()
代码
import more_itertools as mit
def iter_lookahead(iterable, pred):
# Option 1
p = mit.peekable(iterable)
try:
while True:
line = next(p)
next_line = p.peek()
if pred(next_line):
# Do something
pass
else:
print(line)
except StopIteration:
return
pred = lambda x: x.startswith("0")
iter_lookahead(lines, pred)
输出
A
B
0
下面是包括由@Muhammad Alkarouri提到pairwise
和windowed
工具等选项使用相同的库。
# Option 2
for line, next_line in mit.pairwise(lines):
if pred(next_line):
# Do something
pass
else:
print(line)
# Option 3
for line, next_line in mit.windowed(lines, 2):
if pred(next_line):
# Do something
pass
else:
print(line)
后面的选项可以独立运行或替代先前函数中的逻辑。
是否会导致它从文件中读取两次,或者是否以某种方式缓冲该行? – Mike 2010-11-16 19:09:12
它只读一次。请参见['itertoolsmodule.c']中的'teedataobject_getitem'(http://svn.python.org/projects/python/branches/release27-maint/Modules/itertoolsmodule.c) – 2010-11-16 19:14:44
您的'get_next'在itertools receipes中['pairwise'](http://docs.python.org/library/itertools.html#recipes) – 2010-11-16 19:18:46