2017-03-25 34 views
0

私はPythonの初心者です。リストとして値を持つ2つの辞書にテキストファイルを読み込もうとしています。同じファイル(Python)から2つの辞書を読み込む

ファイルには、次のものが含まれています

term1 doc1 doc3 doc4 
term2 doc5 doc1 
term3 doc6 doc2 

私は同じファイル、ドキュメントなどのキーと値として用語を持つことになり、他方が逆になります1から2つの辞書を作成しようとしています。私はこれまで何をやったかと

inverted_index = {} 
forward_index = {} 
with open('term_sample.txt') as file: 
    for line in file: 
     items = line.split() 
     term, doc = items[0], items[1:] 
     for doc in items[1:] 
      inverted_index[term] = [doc] 
      forward_index[doc] = [term] 

print(inverted_index) 
print(forward_index) 

私は次の出力取得しています:

{'term2': ['doc1'], 'term1': ['doc4'], 'term3': ['doc2']} 
{'doc3': ['term1'], 'doc6': ['term3'], 'doc4': ['term1'], 'doc5': ['term2'], 'doc1': ['term2'], 'doc2': ['term3']} 

をが、これは私が探して出力されます:

{'term1': ['doc1','doc3','doc4'], 'term2': ['doc5','doc1'], 'term3': ['doc6','doc2']} 
{'doc1': ['term1','term2'], 'doc3': ['term1'], 'doc4': ['term1'], 'doc5': ['term2'], 'doc6': ['term3'], 'doc2': ['term3']} 

助けてください私はこれを修正する!

答えて

3

内側のループにinverted_indexに追加する必要はありません。これは各行に対して1回だけ実行されます。

内部ループでは、辞書エントリがすでに存在する場合は追加し、上書きする必要はありません。

#!/usr/bin/env python 

from collections import defaultdict 

inverted_index = defaultdict(list) 
forward_index = defaultdict(list) 
with open('term_sample.txt') as file: 
    for line in file: 
     items = line.split() 
     term, doc = items[0], items[1:] 
     for doc in items[1:]: 
      inverted_index[term].append(doc) 
      forward_index[doc].append(term) 

print(inverted_index) 
print(forward_index) 
+0

FWIW、これは '.setdefault'にデフォルトのオブジェクトを提供するために' list() 'コンストラクタを呼び出すのではなく、空のリストリテラル' [] 'でも働きます。 –

+0

@ PM2Ring良い点。私はちょうど[この質問](http://stackoverflow.com/questions/327534/storing-and-updating-lists-in-python-dictionaries-why-does-this-happen)からコードをコピーしていた – Barmar

+0

今私は見る両方のスタイルが別々の場所にあります。 – Barmar

1

各内面にfor。次のコードを試してみてください:「コーダ」は示唆したように

inverted_index = {} 
forward_index = {} 
with open('test') as f: 
    for line in f: 
     items = line.split() 
     term, docs = items[0], items[1:] 
     inverted_index[term] = docs 
     for doc in docs: 
      terms = forward_index.get(doc, []) 
      terms.append(term) 
      forward_index[doc] = terms 

print(inverted_index) 
print(forward_index) 
1

inverted_indexはインナーforではいけない、とforward_indexのために、あなたが前の値を置き換える:あなたの溶液中の原因キーが更新されるたびに - あなたはdefaultdict(list)collectionsからモジュールを使用することができ

inverted_index = {} 
forward_index = {} 
with open('term_sample.txt') as file: 
    for line in file: 
     items = line.split() 
     term, doc = items[0], items[1:] 
     inverted_index[term] = doc 
     for doc in items[1:] 
      forward_index.setdefault(doc, []).append(term) 

print(inverted_index) 
print(forward_index) 
1

を、私もここdefaultdictを使用します。 doc sが複数termの間で複数回表示されることがありますので、あなたが重複するアイテムを避けるためにsetを使用する必要があります。Barmarが示唆するように

from collections import defaultdict 

inverted_index = defaultdict(set) 
forward_index = defaultdict(list) 
with open('term_sample.txt') as file: 
    for line in file: 
     items = line.split() 
     term, docs = items[0], items[1:] 
     inverted_index[term].update(docs) 
     for doc in docs: 
      forward_index[doc].append(term) 

print(inverted_index) 
print(forward_index) 

は(そして、あなただけの外側のループに一度forward_indexを割り当てる必要があります。 )

+0

"defaultdict"とは何か説明していただけますか? :) – Mow1993

+0

'defaultdict'では、値を持たないキーがある場合、デフォルトで' KeyError'を発生させずにその値を設定することができます。 [Documentation](https://docs.python.org/2/library/collections.html#collections.defaultdict) – Julien

+0

ここでは、「forward_index [doc]」に「TypeError:unhashable type: 'list'」というエラーがスローされます。 。add(term)、ここでinverted_indexを意味しましたか? – Mow1993

関連する問題