2009-04-26 13 views
1

私は2つのファイルを持っています - prefix.txtとterms.txtはどちらも約100行あります。私は10000行 - 約直積Python - ファイルからの行 - すべての組み合わせ

http://en.wikipedia.org/wiki/Join_(SQL)#Cross_join

で3番目のファイルを書き出すしたいと思います。

これはPythonでどのようにアプローチするのが最適でしょうか?

第2に、3番目のファイルに10,000行をランダムな順序で書き込む方法はありますか?

+0

私はこれが宿題の問題であると推測するのはかなり跳躍だと思っています... –

+0

おそらく私は冷笑的ですが、100行の接頭辞と100行の言葉が多すぎると、さらにフィルタや重み付けなどのルールはありません –

+0

実際には127項と93接頭辞がありますので、私は100に丸めて頭の中で乗算を行い、問題を明確にしています。いくつかの "検索と並べ替え"の実験では、大きなリストを作成する必要があります。接頭辞と用語のクロスプロダクトは、驚くほどの方法。しかし、私はしばらくのうちにPythonをやっていないので、私はいくつかのアドバイスを得るだろうと思った。 – BuddyJoe

答えて

1

デカルト積は、すべての組み合わせを列挙します。すべての組み合わせを列挙する最も簡単な方法は、ネストされたループを使用することです。

非常に簡単にランダムな順序でファイルを書き込むことはできません。 「ランダム」な位置に書き込むには、file.seek()を使用する必要があります。あなたはどのような地位を求められるでしょうか?各パート(プレフィックス+ターム)の長さをどのように知っていますか?

ただし、ファイル全体をメモリに読み込むことはできます(100行は何もありません)。メモリ内のコレクションは「ランダム」な順序で処理できます。これにより、出力がランダム化されます。

+0

ランダムな順序で100行のファイルを処理しようとすると... 10000行の出力で重複を避ける必要があります。どうすればいい? – BuddyJoe

+0

ランダムモジュールのドキュメントを読み、シャッフルのようなメソッドを探します。 http://docs.python.org/library/randomhtml –

1
from random import shuffle 
a = list(open('prefix.txt')) 
b = list(open('terms.txt')) 
c = [x.strip() + y.strip() for x in a for y in b] 
shuffle(c) 
open('result.txt', 'w').write('\n'.join(c)) 

確かに、スピードとメモリの点では最良の方法ではありませんが、10000は簡潔さを犠牲にするほど大きくありません。通常はファイルオブジェクトを閉じ、その内容をRAMに保存せずに、少なくとも1つのファイルをループすることができます。 [:-1]は、abの各要素から末尾の改行を削除します。

編集:s[:-1]の代わりにs.strip()を使用すると、改行を取り除くことができます。移植性が向上します。

+0

私は、少なくとも実際の線ではなく、指数のクロス積をシャッフルすることを検討します。その方法で、aとbから線を選び、2つのファイルの内容とシャッフル出力するファイルの10,000行すべてを格納するよりも安価な整数ペアのリスト。行の長さによって異なります。 –

+0

私が言ったように、これはどこにも至りませんが、かなり簡潔です。あなたが知っているように、このような小さな入力は、「アプローチする最善の方法」は「読み込み可能なコードを書く」ことを意味します。 – ngn

+2

Blairは、ラインをシャフリングするだけで、整数をシャッフルするほど速くなります(リストは "ポインタの配列"です)。あなたのアプローチは間違いなくngnの解決策よりも遅くなる間接化のコストを招きます。メモリにメガバイトまたは2つのテキストを格納する(入力ファイルの平均行が50-100バイトの場合)、これらのことを心配する価値はありません。 –

4

itertools.productが必要です。

for prefix, term in itertools.product(open('prefix.txt'), open('terms.txt')): 
    print(prefix.strip() + term.strip()) 

印刷したり、蓄積したり、直接書き込んだりしてください。それぞれに付属している改行のために.strip()が必要です。

その後は、オープンrandom.shuffle(リストを((「thirdfile.txt」))を使用して、それらをシャッフルすることができますが、私はあなたが使用しているサイズのファイルになることをどれだけ速く知りません。

+0

itertoolsを「インポート」するために何か特別な処理を行う必要がありますか?それはIronPythonで壊れます。 – BuddyJoe

+0

申し訳ありませんが、IronPythonに関する経験はありません。 itertoolsはCPythonの標準ライブラリに含まれているので、利用できるはずです。 誰かが私を(そして彼の)ここに助けてくれるかもしれませんか? – sykora

関連する問題