2017-03-25 5 views
0

Ich bin neu in Python und ich versuche, eine Textdatei in zwei Wörterbücher mit Werten als Liste zu lesen.Lesen in zwei Wörterbücher aus der gleichen Datei (Python)

Die Datei enthält folgende Komponenten:

term1 doc1 doc3 doc4 
term2 doc5 doc1 
term3 doc6 doc2 

Ich versuche, zwei Wörterbücher aus der gleichen Datei zu erstellen, eine, die die Bedingungen als Schlüssel und Werte als docs haben wird und die anderen das Gegenteil sein.

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) 

mit dem, was ich bisher getan habe ich die folgende Ausgabe bekommen:

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

aber dies ist die Ausgabe, die ich suche:

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

Bitte helfen ich, um das zu beheben!

Antwort

3

Sie müssen nicht zu inverted_index in der inneren Schleife hinzufügen, das ist nur einmal für jede Zeile.

In der inneren Schleife müssen Sie an den Wörterbucheintrag anhängen, wenn es bereits vorhanden ist, nicht überschreiben.

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) 
+0

FWIW, dies funktioniert auch mit einem leeren Listenliteral '[]' (anstatt den 'list()' -Konstruktor aufzurufen), um das Standardobjekt für '.setdefault' bereitzustellen. –

+0

@ PM2Ring Guter Punkt. Ich habe nur den Code von [dieser Frage] kopiert (http://stackoverflow.com/questions/327534/storing-and-updating-lists-in-python-dictionaries-why-does-thishappen) – Barmar

+0

Jetzt sehe ich Beide Stile gibt es an verschiedenen Orten. – Barmar

1

Sie defaultdict(list) von collections Modul verwenden könnten - Ursache in Ihrer Lösung der Schlüssel aktualisiert wird jedes Mal: ​​

#!/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) 
1

inverted_index sollen nicht in den inneren for und für forward_index, ersetzt Sie den vorherigen Wert in jedem inneren for. Versuchen Sie, den folgenden Code:

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

Als 'Coder' vorgeschlagen, würde ich auch hier eine defaultdict verwenden. Da die doc s mehr als einmal über mehrere term s erscheinen, sollten Sie eine set verwenden doppelte Elemente zu vermeiden:

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) 

(Und wie Barmar schon sagt, müssen Sie nur die forward_index einmal in der äußeren Schleife zuzuordnen.)

+0

Kannst du mir bitte erklären, was "defaultdict" ist? :) – Mow1993

+0

Mit einem 'defaultdict', wenn es einen Schlüssel gibt, der keinen Wert hat, können Sie festlegen, was dieser Wert ist, ohne dass er' KeyError' anhebt. [Dokumentation] (https://docs.python.org/2/library/collections.html#collections.defaultdict) – Julien

+0

Hier wird jedoch ein Fehler ausgegeben "TypeError: nicht hashbarer Typ: 'list'" in "forward_index [doc] .add (Begriff), meinst du inverted_index hier? – Mow1993

Verwandte Themen