0

データが '\n' で区切られているソート済みファイルのリストがあります。それらをマージして、単一のソート済みファイルを取得したいと考えています。すべてのファイルのコンテンツを一度にロードしたくありません。heapq ライブラリのマージ機能を使用しています

次のコードを書きました

def merge(*flist):
    for element in heapq.merge(*flist):
        yield element

*flist は次のようなタプルです -

(<open file '/tmp/000000', mode 'w+b' at 0xb73eba70>,
<open file '/tmp/000001', mode 'w+b' at 0xb73ebac8>, 
<open file '/tmp/000002', mode 'w+b' at 0xb73ebb20>, 
<open file '/tmp/000003', mode 'w+b' at 0xb73ebb78>, 
<open file '/tmp/000004', mode 'w+b' at 0xb73ebc80>)

上記の要素をループで出力すると、値「2\n」、「44\n」が得られます。出力ファイルもソート順ではありません。問題は改行文字によるものだと思います。この問題に対処する方法。

私はかなり長い間これを修正しようとしていますが、解決できませんでした

4

1 に答える 1

5

入力行を整数に変換して、文字列の並べ替えではなく数値の並べ替えを取得します。

def merge(*flist):
    return heapq.merge(*[itertools.imap(int, f) for f in flist])

heapq.mergeイテレータを繰り返し処理してすべての要素を生成することは無意味であることに注意してください。イテレータを返すだけで、間接レイヤーを保存できます。(実際、関数の元のバージョンはheapq.merge、呼び出しサイトを変更せずに置き換えられた可能性があります。)

于 2013-09-07T06:31:41.780 に答える