Großbuchstaben ...?

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.
Denkow
User
Beiträge: 24
Registriert: Donnerstag 10. Januar 2013, 18:57

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
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.
Denkow
User
Beiträge: 24
Registriert: Donnerstag 10. Januar 2013, 18:57

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.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

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.
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.
Denkow
User
Beiträge: 24
Registriert: Donnerstag 10. Januar 2013, 18:57

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...
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.
Denkow
User
Beiträge: 24
Registriert: Donnerstag 10. Januar 2013, 18:57

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
Benutzeravatar
sparrow
User
Beiträge: 4600
Registriert: Freitag 17. April 2009, 10:28

Sr4l hat geschrieben:Das Problem ist dein return, es wird zu früh ausgeführt.
Denkow
User
Beiträge: 24
Registriert: Donnerstag 10. Januar 2013, 18:57

sparrow hat geschrieben:
Sr4l hat geschrieben:Das Problem ist dein return, es wird zu früh ausgeführt.
das heißt ??? wohin damit ??? :K
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

schau Dir in Lektion 0 nochmal an, wie das mit Python und den Einrückungen ist.
Benutzeravatar
sparrow
User
Beiträge: 4600
Registriert: Freitag 17. April 2009, 10:28

return gibt den Wert zurück und verlässt die Funktion.
Schau mal nach wann sie bei dir aufgerufen wird.
Denkow
User
Beiträge: 24
Registriert: Donnerstag 10. Januar 2013, 18:57

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 :oops:
das erste wort hab ich jetzt auch durch ein [1:] weg gekriegt.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Denkow hat geschrieben:okay, ich habs. doofer fehler :oops:
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 :-D

Lars
Denkow
User
Beiträge: 24
Registriert: Donnerstag 10. Januar 2013, 18:57

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
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

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()]
Denkow
User
Beiträge: 24
Registriert: Donnerstag 10. Januar 2013, 18:57

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 :)
Denkow
User
Beiträge: 24
Registriert: Donnerstag 10. Januar 2013, 18:57

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)]
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Denkow
User
Beiträge: 24
Registriert: Donnerstag 10. Januar 2013, 18:57

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.
Antworten