4

私はファイルを持っています:test.txt各行に文があります。

Hello World  
99 Bottles of Beer  
Humpty Dumpty Sat on the wall

このファイルからの入力のすべての組み合わせ (つまり、2 n -1 の組み合わせ)を表示する出力を生成したいと考えています。上記の例では、アルゴリズムは以下をスピルアウトします - 各組み合わせはパイプ ( |)で区切られます

Hello World  
99 Bottles of Beer  
Humpty Dumpty Sat on the wall  
Hello World | 99 Bottles of Beer  
Hello World | Humpty Dumpty Sat on the wall  
99 Bottles of Beer | Humpty Dumpty Sat on the wall  
Hello World | 99 Bottles of Beer | Humpty Dumpty Sat on the wall  

理想的には、これを bash または python または perl スクリプトで実行したいと考えていますが、提案は受け付けています。

4

2 に答える 2

3
import itertools

l = [s.strip() for s in open('test.txt')]

for i in range(len(l)):
  print '\n'.join(map(' | '.join, itertools.combinations(l, i + 1)))

生産する

Hello World
99 Bottles of Beer
Humpty Dumpty Sat on the wall
Hello World | 99 Bottles of Beer
Hello World | Humpty Dumpty Sat on the wall
99 Bottles of Beer | Humpty Dumpty Sat on the wall
Hello World | 99 Bottles of Beer | Humpty Dumpty Sat on the wall

のスタイルが気に入らない場合'\n'.join()(好きかどうかわかりません)、明示的なループに置き換えることができます。

for i in range(len(l)):
  for c in map(' | '.join, itertools.combinations(l, i + 1)):
    print c

これは少し冗長ですが、より経済的です。

于 2012-12-06T08:22:04.467 に答える
0

できるよ

import itertools

file = open("test.txt")
lines = files.readlines()

current = []
for i in range(len(lines):
    current.append(i)

    for combination in set(itertools.permutations(current)):
        for l in combination:
            output+=' | '.join(lines[l])
        output+= '\n'
print output

itertools と set スキルにうんざりしていますが、メモリの制約がない限り、これでうまくいくはずです..

于 2012-12-06T08:21:10.957 に答える