巻き戻しの答えは、小さなファイルに適しています。一般的な解決策が必要な場合は、イテレータとジェネレータに固執してください。
line_i、line_i+3、line_i+4 のタプルを生成するジェネレーター関数を定義できます。
輸入品で
from collections import deque
from itertools import islice
新しいジェネレーター関数を定義できます。
def reflexive_zip(iterator, offset = 0):
offset = int(offset)
if offset == 0:
for element in iterator:
yield (element, element)
else:
d = deque(islice(iterator,abs(offset)))
for element in iterator:
d.append(element)
if offset < 0:
yield (element, d.popleft())
else:
yield (d.popleft(), element)
を取り、iterator
を使用してバッファを作成し、deque
の要素のタプルを生成しiterator
ます。オフセットは引数で制御できoffset
ます。
これが完全なスクリプトです。使用例は本文にあります。
if __name__ == "__main__":
from cStringIO import StringIO
f = StringIO("""Header 1
line 1
line 2
line 3
line 4
Header 2
line 1
line 2
line 3
line 4""")
#for line, other_line in reflexive_zip(f, 4):
# print "%s -> %s" %(line, other_line)
for ((line, _ignore),(line3, line4)) in reflexive_zip(reflexive_zip(f,1),3):
print "%s -> %s %s" %(line, line3, line4)
from collections import deque
from itertools import islice
def reflexive_zip(iterator, offset = 0):
offset = int(offset)
if offset == 0:
for element in iterator:
yield (element, element)
else:
d = deque(islice(iterator,abs(offset)))
for element in iterator:
d.append(element)
if offset < 0:
yield (element, d.popleft())
else:
yield (d.popleft(), element)
if __name__ == "__main__":
from cStringIO import StringIO
f = StringIO("""Header 1
line 1
line 2
line 3
line 4
Header 2
line 1
line 2
line 3
line 4""")
#for line, other_line in reflexive_zip(f, 4):
# print "%s -> %s" %(line, other_line)
for ((line, _ignore),(line3, line4)) in reflexive_zip(reflexive_zip(f,1),3):
print "%s -> %s %s" %(line, line3, line4)
出力:
Header 1
-> line 3
line 4
line 1
-> line 4
Header 2
line 2
-> Header 2
line 1
line 3
-> line 1
line 2
line 4
-> line 2
line 3
Header 2
-> line 3
line 4