2016-07-25 24 views
0

Entschuldigung für die Frage, aber ich bin ein bisschen neu zu diesen Dingen. Ich mache ein Splitting Wörter aus dem Text und setzen sie einen Index für jedes Token dict erstellen:Erstellen Sie ein Wörterbuch aus einer Liste alle Leerzeichen löschen

import re 
f = open('/Users/Half_Pint_Boy/Desktop/sentenses.txt', 'r') 

a=0 
c=0 
e=[] 

for line in f: 

    b=re.split('[^a-z]', line.lower()) 
    a+=len(list(filter(None, b))) 
    c = c + 1 
    e = e + b 

d = dict(zip(e, range(len(e)))) 

Aber am Ende erhalte ich einen dict mit Leerzeichen in es wie folgt aus:

{'': 633, 
'a': 617, 
'according': 385, 
'adjacent': 237, 
'allow': 429, 
'allows': 459} 

Wie kann ich "" aus dem Endergebnis in dict entfernen? Wie kann ich die Indexierung danach ändern, um "" beim Index-Zählen nicht zu verwenden? (mit "" der Index zählt 633, ohne-248) Vielen Dank!

Antwort

2

Wie wäre es damit?

b = list(filter(None, re.split('[^a-z]', line.lower()))) 

Als Alternative:

b = re.findall('[a-z]+', line.lower()) 

In beiden Fällen können Sie dann auch entfernen, dass filter aus der nächsten Zeile:

a += len(b) 

EDIT

Als Neben Ich denke, was du hier hast, ist ein Wörterverzeichnis, das Wörter abbildet an die letzte Position, in der sie im Text erscheinen. Ich bin mir nicht sicher, ob Sie das vorhaben. Z.B.

>>> dict(zip(['hello', 'world', 'hello', 'again'], range(4))) 
{'world': 1, 'hello': 2, 'again': 3} 

Wenn Sie stattdessen ein Wort auftritt Spur von alle die Positionen halten wollen, versuchen Sie vielleicht diesen Code statt:

from collections import defaultdict 
import re 

indexes = defaultdict(list) 

with open('test.txt', 'r') as f: 
    for index, word in enumerate(re.findall(r'[a-z]+', f.read().lower())): 
     indexes[word].append(index) 

indexes bildet dann jedes Wort auf eine Liste von Indizes, bei denen die Wort erscheint.

EDIT 2

Basierend auf den Kommentar Diskussion unten, ich glaube, Sie so etwas wie dies mehr will:

from collections import defaultdict 
import re 

word_positions = {} 

with open('test.txt', 'r') as f: 
    index = 0 
    for word in re.findall(r'[a-z]+', f.read().lower()): 
     if word not in word_positions: 
      word_positions[word] = index 
      index += 1 

print(word_positions) 

# Output: 
# {'hello': 0, 'goodbye': 2, 'world': 1} 
+0

Vielen Dank für Ihre Eingabe! Aber wie kann das Zählen von "" während der Indizierung vermieden werden? – HalfPintBoy

+0

Haben Sie diesen Code ausprobiert?Kannst du ein Beispiel geben, wo es nicht das tut, was du willst? – smarx

+0

Ja, aber ich verstehe nicht: Wenn ich 254 eindeutige Wörter habe, warum gibt der Algorithmus Indizes mehr als 254 (bis zu 633). Wie kann das vermieden werden - um 0 von n-1 Indizes zu bekommen – HalfPintBoy

1

ersetzen:

d = dict(zip(e, range(len(e)))) 

mit:

d = {word:n for n, word in enumerate(e) if word} 

Alternativ können die leeren Einträge in erster Linie zu vermeiden, ersetzen:

b=re.split('[^a-z]', line.lower()) 

mit:

b=re.split('[^a-z]+', re.sub('(^[^a-z]+|[^a-z]+$)', '', line.lower())) 
+0

Das funktioniert, aber ich persönlich bevorzuge es, die leeren Strings früher im Prozess zu filtern. – smarx

+0

@smarx OK. Ich habe eine Methode dafür hinzugefügt. P.S. Deine Antwort hatte bereits +1. – John1024

1

Ihre Regex sieht nicht gut. Verwenden Sie:

line = re.sub('[^a-z]*$', '', line.strip()) 
b = re.split('[^a-z]+', line.lower()) 
Verwandte Themen