長さに基づいてそれらを別々のファイルに分割し、後でそれらを結合し直します-次のようなものです:
from tempfile import TemporaryFile
from itertools import chain
ファイル長 -> 出力ファイルの参照辞書を保持します。ファイルが既に開いている場合は、そのファイルに書き込むか、新しい一時ファイルを作成します。
output = {}
with open('input') as fin:
for line in fin:
length = len(line.split())
output.setdefault(length, TemporaryFile()).write(line)
Steven Rumbalski が指摘したように、これはdefaultdict
:
from collections import defaultdict
output = defaultdict(TemporaryFile)
...
output[length].write(line)
一時ファイルはすべてファイルの最後を指しています。それらを最初にリセットして、それらを読んだときにデータを再度取得します...
for fh in output.values():
fh.seek(0)
各ファイルから長さの昇順で行を取得し、それらすべてを最終出力ファイルに書き込みます。
with open('output', 'w') as fout:
fout.writelines(chain.from_iterable(v for k,v in sorted(output.iteritems())))
Python は、プログラムの終了時に一時ファイルをクリーンアップする必要があります...