Seite 1 von 3
Großbuchstaben ...?
Verfasst: Montag 14. Januar 2013, 19:37
von Denkow
Hallöchen,
ich würde gerne ein kleines Programm schreiben, das mir alle Wörter, die mit einem Großbuchstaben beginnen, in einer Liste wieder ausgibt.
Mein erster Gedanke war in etwa folgender:
Code: Alles auswählen
def findeGrossbuchstaben(satz):
liste = []
a = satz.split()
for word in a:
if r"[^A-Z]word":
liste.append(word)
return liste
funktioniert allerdings noch nicht so wie ich das gerne hätte...
print findeGrossbuchstaben("Das ist ein Satz mit Grossbuchstaben") gibt mir das aus:
['Das']
zusätzlich soll jedoch noch das erste Wort des Satzes völlig ignoriert werden. Daran hab ich mich jedoch noch nicht herangetastet....
könnt ihr mir helfen? :K
Re: Großbuchstaben ...?
Verfasst: Montag 14. Januar 2013, 20:11
von BlackJack
@Denkow: Schau Dir mal die Methoden an, die es so auf Zeichenketten gibt. Da ist auch eine dabei die testet ob es sich um Grossbuchstaben handelt.
Und beschreibe doch mal unter welchen Umständen Dein Quelltext jemals mehr als ein Element in der Liste zurückgeben würde.
Re: Großbuchstaben ...?
Verfasst: Montag 14. Januar 2013, 20:19
von Denkow
BlackJack hat geschrieben:@Denkow: Schau Dir mal die Methoden an, die es so auf Zeichenketten gibt. Da ist auch eine dabei die testet ob es sich um Grossbuchstaben handelt.
ich dachte "if r"[^A-Z]word"" testet schon auf Großbuchstaben am Wortanfang...?!
BlackJack hat geschrieben:Und beschreibe doch mal unter welchen Umständen Dein Quelltext jemals mehr als ein Element in der Liste zurückgeben würde.
ja, meine Funktion kann wohl nur ein Wort ausgegeben....wie gibt sie mir alle Wörter mit Großbuchstaben zurück?
das ist ja erstmal meine eigentiche frage.
Re: Großbuchstaben ...?
Verfasst: Montag 14. Januar 2013, 20:31
von Sr4l
Denkow hat geschrieben:
funktioniert allerdings noch nicht so wie ich das gerne hätte...
Das Problem ist dein return, es wird zu früh ausgeführt.
BlackJack meinte das du es einfach mit so etwas wie word[0].isupper() testen kannst.
Re: Großbuchstaben ...?
Verfasst: Montag 14. Januar 2013, 20:37
von BlackJack
@Denkow: Dein ``if`` testet ob '[^A-Z]word' eine nicht-leere Zeichenkette ist. Was logischerweise immer wahr ist, denn da sind ja Zeichen drin. Wenn Du reguläre Ausdrücke verwenden möchtest, dann musst Du schon das `re`-Modul verwenden. Wir sind hier nicht bei Perl wo es spezielle Syntax dafür gibt. Aber auch als regulärer Ausdruck macht das nicht das was Du willst.
Edit: Bei der Namensgebung könntest Du mal einen Blick in den
Style Guide for Python Code werfen. Und `a` geht ja mal überhaupt nicht. Namen sollen dem Leser vermitteln welche Bedeutung der Wert dahinter im Kontext des Programms hat. `a` sagt da überhaupt nichts aus. Ich würde das Zwischenergebnis hier auch nicht unbedingt an einen Namen binden.
Re: Großbuchstaben ...?
Verfasst: Montag 14. Januar 2013, 20:40
von Denkow
Sr4l hat geschrieben:
Das Problem ist dein return, es wird zu früh ausgeführt.
also fehlt wohl noch etwas?!
Sr4l hat geschrieben:
BlackJack meinte das du es einfach mit so etwas wie word[0].isupper() testen kannst.
ja, das klappt

danke! Jetzt wird mir immerhin das erste Wort des Satzes nicht mehr ausgegeben...allerdings wird mir trotzdem nur ein wort ausgegeben

damit meinst du wohl auch, dass mein return zu früh ausgeführt wird.
natürlich sagt "a" erstmal gar nichts aus. mir ist erstmal nur wichtig, dass es läuft und dann kann ich das ganze ja immer noch ändern...
Re: Großbuchstaben ...?
Verfasst: Montag 14. Januar 2013, 20:51
von BlackJack
@Denkow: Das führt erfahrungsgemäss zu schlechten Namen die im Code bleiben, weil wenn es erst einmal läuft, es oft doch nicht noch einmal überarbeitet wird. Ausserdem hilft es sich gleich passende und aussagekräftige Namen auszudenken über das Problem und die Lösung besser nachdenken zu können. Einem muss ja klar sein was ein Wert bedeutet, dann findet man auch leicht einen Namen. Andersherum ist es wenn man keinen guten Namen findet ein Zeichen, dass man vielleicht gar nicht so genau weiss was man da gerade tut.
In dem Code fehlt nichts sondern es wird an der falschen Stelle die Funktion mit dem ``return`` beendet. Vollzieh den Programmablauf doch einfach mal an einem Beispiel im Kopf oder auf Papier nach. Gib doch mal einen Beispielablauf an bei dem Du glaubst, dass jemals mehr als ein Wort in der Liste landen könnte.
Und irgendetwas muss noch falsch sein, denn das erste Wort sollte im Ergebnis sein, wenn Du nur den Test geändert hast und es weiterhin der gleiche Satz im Test ist.
Re: Großbuchstaben ...?
Verfasst: Montag 14. Januar 2013, 21:07
von Denkow
also ich habe die funktion nochmal (hoffentlich nachvollziehbarer) überarbeitet und kommentare hinzugefügt:
Code: Alles auswählen
def findeGrossbuchstaben(satz):
#erstellt eine leere liste, in der später alle woerter,
#die mit einem grossbuchstaben beginnen, stehen sollen
ergebnis = []
#teilt den satz in einzelne woerter auf und erstellt
#daraus eine liste
gesplitted = satz.split()
#iteriert ueber die liste der einzelnen woerter des satzes
for word in gesplitted:
#schaut welche woerter grossbuchstaben enthalten
if word[0].isupper():
#an die oben erstelle leere liste sollen nun alle
#woerter mit grossbuchstaben hinzugefuegt werden,
#die im satz enthalten sind
ergebnis.append(word)
#nun soll die liste aller woerter mit grossbuchstaben
#ausgegeben werden
return ergebnis
der ansatz stimmt soweit, oder?
aber immer noch das problem, dass ich nur ein wort ausgegeben bekomme und ich weiß wirklich nicht wieso

HILFE
Re: Großbuchstaben ...?
Verfasst: Montag 14. Januar 2013, 21:11
von sparrow
Sr4l hat geschrieben:Das Problem ist dein return, es wird zu früh ausgeführt.
Re: Großbuchstaben ...?
Verfasst: Montag 14. Januar 2013, 21:14
von Denkow
sparrow hat geschrieben:Sr4l hat geschrieben:Das Problem ist dein return, es wird zu früh ausgeführt.
das heißt ??? wohin damit ??? :K
Re: Großbuchstaben ...?
Verfasst: Montag 14. Januar 2013, 21:20
von Sirius3
schau Dir in Lektion 0 nochmal an, wie das mit Python und den Einrückungen ist.
Re: Großbuchstaben ...?
Verfasst: Montag 14. Januar 2013, 21:23
von sparrow
return gibt den Wert zurück und verlässt die Funktion.
Schau mal nach wann sie bei dir aufgerufen wird.
Re: Großbuchstaben ...?
Verfasst: Montag 14. Januar 2013, 21:33
von Denkow
Code: Alles auswählen
def findeGrossbuchstaben(satz):
#erstellt eine leere liste, in der später alle woerter,
#die mit einem grossbuchstaben beginnen, stehen sollen
ergebnis = []
#teilt den satz in einzelne woerter auf und erstellt
#daraus eine liste
gesplitted = satz.split()
#iteriert ueber die liste der einzelnen woerter des satzes
for word in gesplitted[1:]:
#schaut welche woerter grossbuchstaben enthalten
if word[0].isupper():
#an die oben erstelle leere liste sollen nun alle
#woerter mit grossbuchstaben hinzugefuegt werden,
#die im satz enthalten sind
ergebnis.append(word)
#nun soll die liste aller woerter mit grossbuchstaben
#ausgegeben werden
return ergebnis
okay, ich habs. doofer fehler
das erste wort hab ich jetzt auch durch ein [1:] weg gekriegt.
Re: Großbuchstaben ...?
Verfasst: Montag 14. Januar 2013, 21:45
von Sr4l
Denkow hat geschrieben:okay, ich habs. doofer fehler
das erste wort hab ich jetzt auch durch ein [1:] weg gekriegt.
Durch sowas lernt man.
Du solltest dir überlegen die Einrückung auf 4 Leerzeichen zu reduzieren sonst brauchst du bald nen "wider widescreen Montitor".
Du ignorierst momentan das erste Wort, ein Satz kann mit einem Nomen beginnen, das würdest du dann "verlieren".
Viel Spaß noch mit Python
Lars
Re: Großbuchstaben ...?
Verfasst: Montag 14. Januar 2013, 21:50
von Denkow
wie kann ich denn meiner funktion jetzt noch sagen, dass sie zum beispiel immer n wörter zusammenfügen soll?
beispiel:
findeGrossbuchstaben("Heute trifft sich Tina Maier mit Max Mustermann", 2)
[('Tina', 'Maier'),('Max', 'Mustermann')]
??? :K
Re: Großbuchstaben ...?
Verfasst: Montag 14. Januar 2013, 21:55
von Sirius3
jetzt nur noch: üblicherweise werden nur 4 Leerzeichen als Einrückung gemacht.
Code: Alles auswählen
def finde_woerter_mit_grossbuchstaben(satz):
return [wort for wort in satz.split()[1:] if wort[0].isupper()]
Re: Großbuchstaben ...?
Verfasst: Montag 14. Januar 2013, 21:55
von Denkow
Sr4l hat geschrieben:
Du ignorierst momentan das erste Wort, ein Satz kann mit einem Nomen beginnen, das würdest du dann "verlieren".
das macht erstmal nichts

ich bin erstmal froh so kleine sachen mit ach und krach hinzubekommen

Re: Großbuchstaben ...?
Verfasst: Montag 14. Januar 2013, 21:59
von Denkow
wie kann ich denn meiner funktion jetzt noch sagen, dass sie zum beispiel immer n wörter zusammenfügen soll?
beispiel:
findeGrossbuchstaben("Heute trifft sich Tina Maier mit Max Mustermann", 2)
[('Tina', 'Maier'),('Max', 'Mustermann')]
???
Code: Alles auswählen
def findeGrossbuchstaben(satz, n):
#erstellt eine leere liste, in der später alle woerter,
#die mit einem grossbuchstaben beginnen, stehen sollen
ergebnis = []
#teilt den satz in einzelne woerter auf und erstellt
#daraus eine liste
bla = satz.rstrip("?")
gesplitted = bla.split()
#iteriert ueber die liste der einzelnen woerter des satzes
for word in gesplitted[1:]:
#schaut welche woerter grossbuchstaben enthalten
if word[0].isupper():
#an die oben erstelle leere liste sollen nun alle
#woerter mit grossbuchstaben hinzugefuegt werden,
#die im satz enthalten sind
ergebnis.append(word)
ab = zip(*[iter(ergebnis[k:]) for k in xrange(n)])
#nun soll die liste aller woerter mit grossbuchstaben
#ausgegeben werden
return ab
print findeGrossbuchstaben("Heute trifft sich Tina Maier mit Max Mustermann", 2)
wenn ich es so mache, bekomme ich das hier ausgegeben:
[('Tina', 'Maier'), ('Maier', 'Max'), ('Max', 'Mustermann')]
ich möchte jedoch [('Tina', 'Maier'), ('Max', ''Mustermann)]
Re: Großbuchstaben ...?
Verfasst: Montag 14. Januar 2013, 22:51
von Sirius3
schau mal wieder Deine Einrückungen an.
Willst Du wirklich immer zwei Wörter zusammen, oder nur wenn die zwei Wörter
hintereinander stehen?
Verstehst Du überhaupt die 'ab'-Zeile die Du irgendwo abgeschrieben hast?
Wenn ja, ist es auch kein Problem, das in Dein gewünschtes Ergebnis umzuschreiben.
Re: Großbuchstaben ...?
Verfasst: Dienstag 15. Januar 2013, 13:13
von Denkow
was ist denn jetzt schon wieder mit meinen einrückungen falsch? hab doch gar nichts verändert.
ich möchte, dass 2 wörter, die hintereinander stehen und großbuchstaben enthalten, zusammen in ein tuple geschrieben werden. sobald ein wort ohne großbuchstaben dazwischen ist, gehören die beiden wörter nicht mehr zusammen.