Wort aus Text auslesen.

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.
Mycron
User
Beiträge: 12
Registriert: Samstag 10. Mai 2008, 20:18

Hm, also im Moment scheint es noch einen Fehler zwischen Auslesen und ins dict schreibenzu geben, und zwar kommt nur die letzte Zeile der Textdatei auch wirklich in den dictionarys an:

Code: Alles auswählen

datei = file('F:\Test.txt','r')
daten = str(datei.read()) #nimmt den Zeilenumbruch nicht mit
datei.close()
liste = daten.split("\n") # das ist der Zeilenumbruch, fungiert als
                          # Trennungsmarke

for e in range(len(liste)):
       
    woerter = liste[e].split(" - ")

    print 'woerter:'
    print woerter
     
d1 = {woerter[0]:woerter[1]}             #w0 = Interpret / w1 = Titel
d2 = {woerter[1]:woerter[0]}

print 'd1: '
print d1
print 'd2: '
print d2
Liefert folgendes Ergebnis:
woerter:
['Linkin Park', 'No Roads Left']
woerter:
['SUM41', 'Summer']
woerter:
['Yellowcard', 'Takedown']
woerter:
['Yellowcard', 'Fighting']
d1:
{'Yellowcard': 'Fighting'}
d2:
{'Fighting': 'Yellowcard'}
Aber ich versteh ned wieso. Angesprochen wird immer das erste und das zweite Element der Liste. Ich erhalte 4 Listen, warum erreicht nur eine das dict? Ich dachte erst es liegt daran, das dict-Zeilen nicht eingerückt sind, aber Fehlanzeige. Kann es sein, das ein dictionary-Einträge jedesmal überschrieben werden?


EDIT: Ach wie geil, ich habs gelöst!! :D Scheint wirklich jedes mal überschirben zu werden, denn aufgrund dieser Annahme hab ich mir überlegt ich erstelle 2 leere dictionaries und füge dann nach und anch die Werte hinzu. Und voila, es klappt!!

Code: Alles auswählen

d1 = {}
d2 = {}
for e in range(len(liste)):
       
    woerter = liste[e].split(" - ")

    print 'woerter:'
    print woerter
     
    d1[woerter[0]] = woerter[1]          #w0 = Interpret / w1 = Titel
    d2[woerter[1]] = woerter[0]
woerter:
['Linkin Park', 'No Roads Left']
woerter:
['SUM41', 'Summer']
woerter:
['Yellowcard', 'Takedown']
woerter:
['Yellowcard', 'Fighting']
d1:
{'Linkin Park': 'No Roads Left', 'SUM41': 'Summer', 'Yellowcard': 'Fighting'}
d2:
{'Summer': 'SUM41', 'Fighting': 'Yellowcard', 'Takedown': 'Yellowcard', 'No Roads Left': 'Linkin Park'}
Zef*x, jetzt fehlt bei d1 aber wieder ein Element... :(
Achtung, ein n00b! ;)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ich habe dir die Lösung in einer meine vorigen Posts doch schon längst genannt. Benutze Listen bei den Werte. Im Moment überschreibst du einfach immer. "=" ist ein ZUWEISUNG und keine magisches Anhängen.

Und benutze doch bitte "readlines" und implementiere es nicht selber. Die überschüssigen Newlines wirst du mit der "strip"-Methode los. Unter Windows zum Beispiel funktioniert dein Ansatz nämlich nicht korret, da das "carriage return" erhalten bleibt.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Code: Alles auswählen

pairs = {}
for line in liste:
    artist, title = line.split(' - ')
    # wenn artist noch nicht im dict ist,
    # lege eine neue liste an und hänge dort title an
    # wenn er schon im dict ist -> hänge an
    pairs[artist] = pairs.get(artist, []) + [title]

# oder hier, etwas einfacher:
from collections import defaultdict
pairs = defaultdict(list)
for line in liste:
    artist, title = line.split(' - ')
    pairs[artist].append(title)
So also würde man das wohl tun und so hab ich sowas schon öfters getan...
Mycron
User
Beiträge: 12
Registriert: Samstag 10. Mai 2008, 20:18

@ EyDu: Ja, ich weiß das du mir nen Lösungsvorschlag schonmal geliefert hast, allerdings hatte ich dessen "Wirkung" nicht komplett verstanden und hab ihn deshalb nicht übernommen. Weil es bringt mich ja ned weiter wenn ich den "selbstgeschrieben" Code ned verstanden habe ;) Und nochmal nachfragen wollte ich auch ned :oops:
"readlines" hatte ich im ersten Codeentwurf drin, allerdings hat mir das jemand (weiß leider nicht mehr wer) mir read ersetzt, weil read wohl die Teilenumbrüche nicht mitnimmt.

@ audax: Mir wär dein erster Vorschlag lieber, weil ich erstmal versuchen möchte mit den "Standarts" zurechtzukommen bevor ich mich auf die Importierung von "Addons" stürze :)
Ich wusste gar ned das ne Doppelzuweisung wie in Zeile 4 bei sowas auch funktioniert. Heißt das du bringst in einer Zeile unter, das artist immer das vor dem Trennzeichen und title immer das dahinter ist?!

Nochmal vielen Dank für die Mühe und die Geduld... :wink:
Achtung, ein n00b! ;)
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Code: Alles auswählen

In [1]: foo = range(5)

In [2]: print foo
[0, 1, 2, 3, 4]

In [3]: zero, one, two, three, four = foo

In [4]: print zero
0

In [5]: print one
1
Siehe:
Tutorial[/url]
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Und man kann es fast noch lesen:

Code: Alles auswählen

>>> from operator import itemgetter
>>> from itertools import groupby
>>> l = [(1,"a"), (2,"b"), (1,"c")]
>>> dict((k, map(itemgetter(1), g)) for k, g in groupby(sorted(l), itemgetter(0)))
{1: ['a', 'c'], 2: ['b']}
>>> 
Benutzeravatar
roschi
User
Beiträge: 225
Registriert: Samstag 29. März 2008, 18:58
Wohnort: Thueringen, Deutschland
Kontaktdaten:

hallo,

ich wollt nochmal kurz was zu dem 'methodcaller' sagen:

kann man da nicht auch einfach 'exec(string)' nehmen?

mfg
roschi
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Nein, weil String-Code auszuführen zu Security und Maintainability-Nightmares führt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
roschi
User
Beiträge: 225
Registriert: Samstag 29. März 2008, 18:58
Wohnort: Thueringen, Deutschland
Kontaktdaten:

hallo,

naja, wenn du meinst.
ich hatte zwar noch keine probleme damit. aber ich habe es auch noch nicht SO OFT genutzt. :)

mfg
roschi
BlackJack

Das meint nicht nur Leonidas. Es gibt eigentlich so gut wie immer eine Alternative zu ``exec``, die direkter, nicht so fehleranfällig, und in der Regel schneller ist. Zusätzlich zu den schon genannten Problemen wird bei ``exec`` jedesmal der Compiler angeworfen um das Stückchen selbst gebastelten Quelltext in Bytecode zu übersetzen.

``exec`` und auch `eval()` werden normalerweise von Leuten benutzt, die die Sprache noch nicht beherrschen und dafür einen unsaubere Abkürzung brauchen.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Wenn wir schon mal dabei sind, solltest du "input()" auch gleich sein lassen. Das ist nur eine Komposition aus "raw_input" und "eval".
Benutzeravatar
roschi
User
Beiträge: 225
Registriert: Samstag 29. März 2008, 18:58
Wohnort: Thueringen, Deutschland
Kontaktdaten:

hallo,

ja ok, wenn bei 'exec' immer der compiler angeht... dann muesste das ja auch ziemlich langsam sein. aber trotzdem finde ich es manchmal recht nuetzlich.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

roschi hat geschrieben:ja ok, wenn bei 'exec' immer der compiler angeht... dann muesste das ja auch ziemlich langsam sein. aber trotzdem finde ich es manchmal recht nuetzlich.
Wie BlackJack sagte, wenn man keine saubere Lösung kennt, dann nutzt man ``exec``. Das ist etwa oft bei Leuten der Fall, die statt Dictioneries lieber nummerierte Variablen verwenden.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
roschi
User
Beiträge: 225
Registriert: Samstag 29. März 2008, 18:58
Wohnort: Thueringen, Deutschland
Kontaktdaten:

wort1 = "hallo"
wort2 = "tschuess"

das gibt es ja leider oft! warum umstaendlich wenns auch einfach geht? :(
ich hab das am anfang, als ich noch keine erfahrung mit listen hatte auch so gemacht, finde es aber mittlerweile sehr anstraengend!

mfg
roschi
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

roschi hat geschrieben:wort1 = "hallo"
wort2 = "tschuess"

das gibt es ja leider oft! warum umstaendlich wenns auch einfach geht? :(
Weil es bei wort4096 sehr kompliziert wird und alle Features die Listen bieten (iterieren, einfügen, löschen) wegfallen.
Und sowas gibt es eben bei quasi jeder Lösung die ``exec`` nutzt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

BlackJack hat geschrieben:``exec`` und auch `eval()` werden normalerweise von Leuten benutzt, die die Sprache noch nicht beherrschen und dafür einen unsaubere Abkürzung brauchen.
Aber es wird doch wohl auch gute Gründe für den Einsatz von eval und exec geben, sonst gäbe es diese Möglichkeiten doch nicht.
Oder denke ich hier falsch?

Wenn ich nicht falsch denke: Was wären denn "pythonische" Einsatzgebiete?
BlackJack

Also ich hab's noch nicht gebraucht und ausser der interaktiven Eingabe von Python-Quelltext durch einen Benutzer, mit all den damit verbundenen Risiken, fällt mir auch nichts ein.

Für eine Python-Shell kann man's gebrauchen und für "unsichere" Funktionsplotter.
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

pütone hat geschrieben:Wenn ich nicht falsch denke: Was wären denn "pythonische" Einsatzgebiete?
Sourcecode in Datenbanken, warum auch immer man das haben können wollte (Plugins oder so).
Skripting für den User, wenn man keine Sandbox braucht.
Dinge, die eben ihrer Natur nach erfordern, dass man Sourcecode zur Laufzeit nur in Textform hat, und den Ausführen möchte,

Jedesmal, wenn man den Code für exec selber generieren möchte, ist es mit ziemlicher Sicherheit falsch.
Sollte man mit absoluter Sicherheit sagen, dass man den Code nicht Vorhersagen kann, ist es vielleicht ein Anwendungsfall
Antworten