入力ファイル名から始めましょう:
files = ('raz.txt','dwa.txt')
そして、いくつかのヘルパー関数。これは、ファイルからすべての単語を読み取るジェネレーターです。
def read(filename):
with open(filename) as f:
for line in f:
if len(line)>0:
yield line.strip()
そして、これはファイルにシーケンスを書き込みます。
def write(filename, lines):
with open(filename, 'w') as f:
f.write('\n'.join(lines))
それでは、2つのジェネレーターを作成しましょう-入力ファイルごとに1つ
words = [read(filename) for filename in files]
次に、そのジェネレータのリストをセットのリストに変換しましょう
wordSets = map(set, words)
これで、各ファイルの一意の単語のみを含む2セットのリストができました。
セットを交差させることにより、すべての入力ファイルに存在する単語を含む別のセットを作成しましょう。
commonWords = set.intersection(*wordSets)
そして書き直しの時間。
for filename in files:
まったく同じファイルに保存したいので、残念ながら、最初にその内容全体をメモリに読み取り、次にそこから書き込む必要があります。(別のファイルで出力したい場合は、ファイルをバッファリングする必要はありません。
リーダージェネレーターを作成し、それを次のようにラップしてすべてをメモリに読み込みますlist()
。
lines = list(read(filename))
次に、単語を指定されたファイルに順番に書き戻しますが、commonWordsにない場合に限ります。
write(filename, (word for word in lines if word not in commonWords))
入力:
raz.txt
gedit
google chrome
git
vim
foo
bar
dwa.txt
firefox
svn
foo
vim
出力:
raz.txt
gedit
google chrome
git
bar
dwa.txt
firefox
svn
重複は両方から削除されました。