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

Beitragvon Mycron » Sonntag 11. Mai 2008, 19:44

Danke für die Erläuterung, hab jetzt aber trotzdem schonmal mit dem andren Vorschlag weitergearbeitet ;)

Also, bis jetzt sieht der Code so aus (er funktioniert sogar!!!:D)

Code: Alles auswählen

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

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

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

Check1 = raw_input('Kennen sie den Interpreten? ')
if Check1 == "nein":
     Check2 = raw_input('Kennen sie den Titel? ')
     if Check2 == "ja":
         Suchabfrage1 = raw_input('Wie heisst der Titel? ')
         if d2.has_key(Suchabfrage1):
            print d2[Suchabfrage1]
         else:
            print 'Kein Eintrag!'
     else:
         print 'Error'

elif Check1 == "ja":
    Suchabfrage2 = raw_input('Wie heißt der Interpret? ') 
    if d1.has_key(Suchabfrage2):
         print d1[Suchabfrage2]
    else:
         print 'Kein Eintrag'


Jetzt noch eine Frage, auf die ich in meinem schlauen Buch im dict-Kapitel keine Antwort finde:
Und zwar funktioniert es so lange, bis pro Interpret nur ein Titel in der Test.txt steht. Da ich weiß (!) das man nicht denselben Schlüssel mehrmals ins dict schreiben kann, muss ich das irgenwie umgehen. Meine Idee wären ein paar Zeilen, die beim Hinzufügen von Elementen ins Dictionary schauen, ob der Schlüssel bereits vergeben ist, und wenn ja, das der Wert einfach noch an den entsprechenden Wert angehängt wird.

Wie ich die Abfrage schreiben kann weiß ich schon (mit try und so :)), aber die Frage ist wie ich es schaffe ihm zu sagen, das der Wert hintenangehängt werden soll.
Ok, ich muss es halt der Werteliste für den entsprechenden Key hinzufügen, aber muss ich dann wirkilch jeder einzelnen Werteliste eine Variable zuordnen um das dann mit x.append(y) zu realisieren??
Achtung, ein n00b! ;)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Sonntag 11. Mai 2008, 19:51

Mycron hat geschrieben:Ich hatte mit dem Tutorial mal angefangen, bin aber nicht ganz durchgestiegen (wegen der Kombination aus Fachbegriffen und dem für einen damaligen 8-Klässler recht komplexen Englisch)


Auch wenn es die aktuellste und umfangreichste Dokumention nur in englischer Sprache gibt, soll es daran allein nicht liegen. Hier ein paar deutschsprachige Einführungen in Python:

Tutorial auf deutsch (etwas alt ..)

A Byte of Python (deutsch)

Wie ein Informatiker denken lernen
Mycron
User
Beiträge: 12
Registriert: Samstag 10. Mai 2008, 20:18

Beitragvon Mycron » Sonntag 11. Mai 2008, 19:59

Ui, wahnsinn, vielen Dank!! :D

Übrigens: Als ich gerade wegen dem Problem, was ich im Post vor dir geschildert habe, gesucht habe, kam ich schon auf die Site "Wie ein Informatiker denken lernen" und dachte mir klasse, die hauste mal zu den Lesezeichen ^^
Achtung, ein n00b! ;)
EyDu
User
Beiträge: 4868
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Sonntag 11. Mai 2008, 20:06

Das mit dem Anhängen ein einen Interpreten ist recht simpel, du muss als Wert nur eine Liste nehmen:

Code: Alles auswählen

the_dicionary.get(the_artist, []).append(new_title)


Schau dir in der Doku mal an, was das "get" macht, dann sollte die Lösung klar sein.
Mycron
User
Beiträge: 12
Registriert: Samstag 10. Mai 2008, 20:18

Beitragvon Mycron » Sonntag 11. Mai 2008, 20:33

Hm, also in der Library Reference hab ichs ned gefunden (was mich etwas stutzig macht, vielleicht bin ich zu dumm zum suchen), aber in meinem Buch hier steht etwas, das deinem Codebeispiel recht nahe kommt (allerdings knapp 300 Seiten weiter als ich bis jetzt bin ^^):

get(index1[, index2])

Gibt den Text des Widgets von Position index1 bis einschließl. index2 als String zurück. Falls das zweite Argument weggelassen wird, wird das Zeichen an der Position index1 zurückgegeben.

Ähm... also des steht bei mir unter dem Kapitel "Komplexe Benutzungsoberflächen", daher steige ich nicht ganz hinter die Methode...
Wärst du bereit mir eine kurze Zusammenfassung zu posten? :)
Ich such simultan im Web, aber das klappt eher schlecht als recht :/

Danke!
Mycron
Achtung, ein n00b! ;)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Sonntag 11. Mai 2008, 20:52

Das eine "get" hat mit dem anderen nichts zu tun. Guck mal hier:

http://docs.python.org/lib/typesmapping.html
Mycron
User
Beiträge: 12
Registriert: Samstag 10. Mai 2008, 20:18

Beitragvon Mycron » Sonntag 11. Mai 2008, 21:03

Jetz bin ich bissl verwirrt :)

Also das get was du mir gerade geschickt hast, das kenn ich, des wollte ich hernehmen statt dem "if d2.has_key(Suchabfrage1):", aber ich merke gerade das das zweideutig geschrieben ist!
Dann, glaube ich, verstehe ich was EyDu geschrieben hat. Das heißt, wenn the_artist noch ned drinsteht schreibt er den mit rein, andernfalls schreibt er gar nichts rein, und in beiden Fällen kommt aber new_title dazu!?

Spitze!!! :D
Achtung, ein n00b! ;)
EyDu
User
Beiträge: 4868
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Sonntag 11. Mai 2008, 21:22

Arr, ja den Code hast du richtig verstanden, nur der Interpret kam bei meinem alten Beispiel nicht dazu. Worauf ich eigentlich hinaus wollte:

Code: Alles auswählen

titles = the_dicionary.get(the_artist, [])
titles.append(new_title)
the_dictionary[the_artist] = titles
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Beitragvon audax » Sonntag 11. Mai 2008, 22:13

EyDu hat geschrieben:Eine LC ohne Prädikat entspricht übrigens einem "map":

Code: Alles auswählen

import string
with open('test.txt') as fh:
    data = map(string.split, fh)
    print data

Ist mir schon klar...allerdings sind LC nicht langsamer und vor allem in solchen Fällen einfach...direkter.
Außerdem bringt map viele Neulinge dazu, es mit lambda zu nutzen, was völlig blöd wäre ;)
EyDu
User
Beiträge: 4868
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Sonntag 11. Mai 2008, 22:23

Soll ich jetzt noch Rücksicht auf Neulinge nehmen und deshalb praktische Funktionen nicht nutzen :? . Und wenn es um Direktheit geht, finde ich ein "map" viel sprechender. Zumindest, wenn man keine Lambda-Ausdrücke schreiben muss, das ist in einer LC kompakter.

Und jetzt bitte nicht mit dem "Zusatzimport" anfangen, das Thema hatten wir letztens doch erst ;-)
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Beitragvon audax » Sonntag 11. Mai 2008, 23:12

EyDu hat geschrieben:Soll ich jetzt noch Rücksicht auf Neulinge nehmen und deshalb praktische Funktionen nicht nutzen :? . Und wenn es um Direktheit geht, finde ich ein "map" viel sprechender. Zumindest, wenn man keine Lambda-Ausdrücke schreiben muss, das ist in einer LC kompakter.

Und jetzt bitte nicht mit dem "Zusatzimport" anfangen, das Thema hatten wir letztens doch erst ;-)

Ich find halt, wenns schon eine extra split-Methode gibt, dann sollte man die auch nutzen:

Code: Alles auswählen

>>> l = ['foo bar fooooobar', 'bar foo foobar']
>>> from itertools import imap
>>> call = lambda f: f()
>>> map(call, imap(operator.attrgetter('split'), l))
[['foo', 'bar', 'fooooobar'], ['bar', 'foo', 'foobar']]

Nich wahr? ;)

Ps:
Bin ich froh, wenn in 2.6 endlich operator.call da ist /o\
EyDu
User
Beiträge: 4868
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Sonntag 11. Mai 2008, 23:16

Das ist wirklich Eleganz auf ganz hohem Niveau :lol:

Aber wenn du imap schon importierst, dann musst du es schon ausnutzen:

Code: Alles auswählen

list(imap(call, imap(operator.attrgetter('split'), l)))
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Beitragvon Trundle » Sonntag 11. Mai 2008, 23:29

EyDu hat geschrieben:Das ist wirklich Eleganz auf ganz hohem Niveau :lol:

Und auch nur etwa halb so schnell :roll:
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Beitragvon audax » Sonntag 11. Mai 2008, 23:33

EyDu hat geschrieben:Das ist wirklich Eleganz auf ganz hohem Niveau :lol:

Aber wenn du imap schon importierst, dann musst du es schon ausnutzen:

Code: Alles auswählen

list(imap(call, imap(operator.attrgetter('split'), l)))

Beim letzten will ich ja aber sowieso die Liste, und so spar ich mir nen Funktionsaufruf ;)

btw:
Ich weiß, wie ineffizient das ist, daher nutze ich ja gerne LCs :D
Ich will LCs in Java :/
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Beitragvon audax » Sonntag 11. Mai 2008, 23:48

Ums mal genau zu sagen:

Code: Alles auswählen

from itertools import imap
import operator

l = ['foo bar fooooobar', 'bar foo foobar']
call = lambda f: f()

def test():
    return map(call, imap(operator.attrgetter('split'), l))
def calltest():
    return [f() for f in imap(operator.attrgetter('split'), l)]

def lctest():
    return [line.split() for line in l]
def gctest():
    return list(line.split() for line in l)

if __name__=='__main__':
    from timeit import Timer
    for func in ['test', 'calltest', 'lctest', 'gctest']:
        t = Timer("%s()" % func, "from __main__ import %s" % func)
        print "Function %s took %fs" % (func, t.timeit())

Function test took 11.511894s
Function calltest took 5.119288s
Function lctest took 3.460341s
Function gctest took 9.458675s

Ich schließe daraus, dass wir dringend operator.call in der stdlib brauchen :D

€dit:
http://docs.python.org/dev/library/oper ... thodcaller

\o/
damit wäre dann das Beispiel folgendermaßen:

Code: Alles auswählen

def mctest():
    return map(methodcaller('split'), l)

Das fände ich gut.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder