unwind的答案適用於小文件。如果你想要一個通用的解決方案,堅持迭代器和生成器。
您可以定義一個生成器函數,它可以生成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
,創建使用iterator
的元件的deque
和產量的元組的一些緩衝。偏移量可以通過參數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
你有什麼這麼遠嗎?它在做什麼,它不應該?或缺少哪些部分? – thegrinner 2013-02-08 13:15:44
目前還不清楚你的意思是不同的背景。 – LtWorf 2013-02-08 13:28:52
這個問題看起來很像這個:http://stackoverflow.com/q/14742446/989121 – georg 2013-02-08 13:44:42