5 Elemente vor+nach einem Element ausgeben!

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
CiveX
User
Beiträge: 34
Registriert: Samstag 23. Mai 2009, 11:48

Hola,

und wieder ich :oops:. Wieder Listen diesmal gekoppelt mit Dateien öffnen und beschreiben.

Also angenommen, ich habe eine Textdatei mischmasch.txt. Dadrin sind:
ich habe heute zu lange geschlafen aber das ist nicht sChlimm

Wie es scheint Wird es heute doch nOch regnen aller vorausicht nach

o lolz I wuZ thar heute u no can
enthalten, der Text ist in utf-8 kodiert.

So, nun lese ich den Text ein, konvertiere ihn in Unicode um, und splitte ihn in Elemente. Da es sich hier um Linguistik handelt, nenne ich es Token.

So jetzt kommt mein Problem mit der Liste und Position.

Ich soll ein gesuchtes Word eingeben, was ich mit word_seek = raw_input() mache. 5 Elemente vor dem gesuchtem Wort und 5 Elemente nach dem gesuchtem Wort sollen ausgegeben werden, WENN es geht (also wenn vor/hinter dem gesuchten Wort weniger als 5 Elemente sind, sollen die weniger als 5 Elemente trotzdem ausgegeben werden)

Also nehmen wir mal den Text von oben, und das gesuchte Wort ist "heute".

Die Ausgabe soll dann sein:
ich habe heute zu lange geschlafen aber das

Wie es scheint wird es heute doch noch regnen aller vorausicht

o lolz I wuz thar heute u no can
Meine Idee sieht in dem Fall so aus:

Code: Alles auswählen

# Anzahl der Token vor und nach dem gesuchtem Wort
n=5

# Datei öffnen
file = open("mischmasch.txt", "rU")

# Das gesuchte Word wird eingegeben
print "Bitte das gesuchte Wort eingeben:"
word_seek = raw_input()

# Jede Zeile im mischmasch.text wird betrachtet
for line in file:
 line = unicode(line, "utf-8").lower() # Jede Zeile wird ins Unicode und kleinbuchstaben konvertiert
 tokens = line.split() # Text wird in Wort-Token gesplittet
 
 # Falls das eingegebene Wort in der Wort-Tokenliste vorhanden ist
 if word_seek in tokens:
  for position in range(0,len(tokens)):
    position = tokens.index(word_seek) # Position = Stelle des gesuchten Wortes
    kollokat = tokens[position - n:position + n] # Postion - 5 bis Position + 5,also 5 Token vor und nach dem gesuchtem Wort
  print " ".join(kollokat)
Aber das ist nicht ganz richtig. Irgendwie gibt er mir das aus:

Code: Alles auswählen

wie es scheint wird es heute doch noch regnen aller
o lolz i wuz thar heute u no can
Kann mir jemand bitte helfen?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Das liegt daran, dass der erste Index negativ wird. Dann wird die Position von hinten gezählt. Probier es einfach mal im Interpreter aus. Lösung:

Code: Alles auswählen

    for position, token in enumerate(tokens):
        if token == word_seek:
            kollokat = tokens[max(0, position - n):position+n]
            print " ".join(kollokat)
Statt der Zeilen 16-21.

Bei range musst du 0 nicht als Startwert angeben. Wenn du den Index möchtest, dann benutze die enumerate-Funktion.
File ist übrigens ein schlechter Namen, da du damit ein built-in-Namen überschreibst.
Als Einrückung solltest du 4 Leerzeichen pro Ebene benutzen, das ist Standard.
Kommentare gehören in die Zeile über den betroffenen Code und nicht noch hinten dran. Außerdem ist eine maximale Zeilenlänge von 79 Zeichen zu beachten (PEP 8).

Edit: Syntax-Fehler kurz korrigiert. Dank an Hyperion.
Zuletzt geändert von EyDu am Mittwoch 17. Juni 2009, 16:19, insgesamt 1-mal geändert.
Das Leben ist wie ein Tennisball.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@EyDu: kleiner Syntaxfehler, ":" hinter der for-Schleife fehlt im Snippet

@CiveX: Wie kommt man denn bitte auf?
o lolz I wuZ thar heute u no can
[/quote]
CiveX
User
Beiträge: 34
Registriert: Samstag 23. Mai 2009, 11:48

Hyperion, ist nur ein Beispieltext den ich erfunden habe. Mir war gerade nach Sinnfreiem "leet"-speak.

Mönsch, jedesmal was neues hier :) :D. Mit Enumerate habe ich noch nicht gearbeitet. Müsste ich mich mal da durchlesen :(.

Danke aber, die Ausgabe ist zumindest korrekt jetzt!
Zuletzt geändert von CiveX am Mittwoch 17. Juni 2009, 16:24, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

CiveX hat geschrieben:Hyperion, ist nur ein Beispieltext den ich erfunden habe. Mir war gerade nach Sinnfreiem "leet"-speak.
Ok, ich fand es ein wenig verwirrend, dass Du Beispielsätze angibst, aber dann "Müll" als Lösung postest ...
Antworten