heapq.merge()
標準ライブラリにあるのに、なぜ自分でロールするのですか?残念ながら、それは重要な議論を提供していません-あなたは自分で飾る-マージする-飾らないダンスをしなければなりません:
from itertools import imap
from operator import itemgetter
import heapq
def extract_timestamp(line):
"""Extract timestamp and convert to a form that gives the
expected result in a comparison
"""
return line.split()[1] # for example
with open("log1.txt") as f1, open("log2.txt") as f2:
sources = [f1, f2]
with open("merged.txt", "w") as dest:
decorated = [
((extract_timestamp(line), line) for line in f)
for f in sources]
merged = heapq.merge(*decorated)
undecorated = imap(itemgetter(-1), merged)
dest.writelines(undecorated)
上記のすべてのステップは「怠惰」です。私は避けているのでfile.readlines()
、ファイルの行は必要に応じて読み取られます。同様に、list-compsではなくジェネレータ式を使用する装飾プロセス。heapq.merge()
怠惰でもあります-必要な比較を行うには、入力イテレータごとに1つのアイテムを同時に必要とします。最後にitertools.imap()
、装飾を解除するために組み込まれているmap()の怠惰なバリアントであるを使用しています。
(Python 3ではmap()が怠惰になっているので、それを使用できます)