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.
Sirius3
User
Beiträge: 17754
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: 17754
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.
BlackJack

@Denkow: Die Einrückung bestimmt wann was ausgeführt wird, also zum Beispiel was in einer Schleife passiert und damit bei jedem Schleifendurchlauf passiert und was nach dem Durchlaufen der Schleife passiert, also nur einmal und erst wenn alle Berechnungen/Ergebnisse aus der Schleife fest stehen. Und wieder der Hinweis: Spiel das mal im Kopf oder auf Papier mit der Beispieleingabe durch. Dann solltest Du eigentlich schnell feststellen wo der Fehler liegt.
Denkow
User
Beiträge: 24
Registriert: Donnerstag 10. Januar 2013, 18:57

das ist mir ja alles bewusst, ich kann mich jedoch grade trotzdem nicht so reindenken um diesen verfluchten fehler zu finden. würde ich ihn selbst finden, würde ich ja nicht nach hilfe schreien :K
BlackJack

@Denkow: Wo ist denn das Problem konkret? An irgend einer Stelle scheinst Du ja beim Durchgehen eines Beispiels nicht weiter zu kommen, oder eine andere Idee von den aktuellen Werten zu haben als das Python-Programm. Welche Stelle ist das?
Denkow
User
Beiträge: 24
Registriert: Donnerstag 10. Januar 2013, 18:57

ab = zip(*[iter(ergebnis[k:]) for k in xrange(n)]) <-- mehr oder weniger diese stelle.

Code: Alles auswählen

def findeGrossbuchstaben(satz, n):
	ergebnis = []
	bla = satz.rstrip("?")
	gesplitted = bla.split()
	for word in gesplitted[1:]:
		if word[0].isupper():
			ab = zip(*[iter(ergebnis[k:]) for k in xrange(n)])
			ergebnis.append(word)
	return ab
		
print findeGrossbuchstaben("Heute trifft sich Tina Maier mit Max Mustermann", 2)
ich verstehe nicht so ganz wieso mir diese zeile jetzt das hier ausgibt:

[('Tina', 'Maier'), ('Maier', 'Max'), ('Max', 'Mustermann')]
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Dann erkläre doch mal, was eben diese Zeile macht, und wann du denkst, dass sie ausgeführt wird.
Denkow
User
Beiträge: 24
Registriert: Donnerstag 10. Januar 2013, 18:57

vermutlich stimmt das mit dem "zip" nicht, da ich glaube, dass es eben immer genau ein wort der liste "ergebnis" weiter geht. Somit fängt die erste liste mit dem ersten wort an, die zweite mit dem zweiten und so weiter....
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Ok, ich fomuliere das mal als fragen:

was denkst du, was macht die Zeile mit dem zip?
wann denkst du wird sie ausgeführt?

Die Fragen hast du nicht wirklich beantwortet.
Denkow
User
Beiträge: 24
Registriert: Donnerstag 10. Januar 2013, 18:57

ab = zip(*[iter(ergebnis[k:]) for k in xrange(n)])

"ab" ist die variable, an die das ergebnis dieser zeile übergeben wird.
sie iteriert über die liste "ergebnis" von anfang bis ende. zip sorgt dafür, dass in der die teillisten in der liste alle die gleiche länge haben und gibt das ergebnis als liste aus. for k in xrange(n) ist dafür zuständig, dass zip weiß wie viele teillisten die ergebnisliste bekommen soll.....soweit jedenfalls mein gedanke.

ausgefüht wird die zeile, nachdem über den satz iteriert wurde und die wörter mit großbuchstaben ausgelesen wurden...oder etwa nicht?!
BlackJack

Ich schliesse mich mal Sirius3 an mit der Vermutung, dass die ``ab = …``-Zeile nicht von Denkow ist. Vielleicht sollte man das als Anfänger mit etwas weniger „Magie” lösen. Also so, dass man es selbst auch versteht was passiert.

Ausserdem ist dieses Gruppieren für eine Funktion die `findeGrossbuchstaben()` heisst, auch ein wenig zu viel. (Der Name trifft auch so schon nicht ganz was die Funktion macht.) Programmieren heisst Probleme in kleinere Teilprobleme zu zerlegen und für die (unabhängigen) Teilprobleme Lösungen zu implementieren. Worte mit Grossbuchstaben finden und Gruppieren von jeweils zwei Elementen zu einem Tupel sind ja unabhängig voneinander, also kann man dafür auch zwei verschiedene Funktionen schreiben und muss nicht eine komplizierter machen als nötig.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@Denkow:

Code: Alles auswählen

>>> print zip.__doc__
zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]

Return a list of tuples, where each tuple contains the i-th element
from each of the argument sequences.  The returned list is truncated
in length to the length of the shortest argument sequence.
>>> zip(('a', 'b', 'c'), ('d', 'e', 'f'))
[('a', 'd'), ('b', 'e'), ('c', 'f')]
Wie Du ja schon vermutest bringt Dich 'zip' nicht wirklich weiter, siehe den zip-docstring und das kleine Beispiel...

Du bist ja bereits an dem Punkt, an dem Du mit der 'isupper'-Methode prüfst, ob ein Wort mit einem Großbuchstaben beginnt. Wenn das der Fall ist, fügst Du dieses Wort zur Liste 'ergebnis' hinzu. Hier ist der Punkt, an dem Du ansetzen musst. Was muss geschehen, wenn ein Wort nicht mit einem Großbuchstaben beginnt? Das wird von Dir bisher noch nicht behandelt.
Wenn ich Dich richtig verstanden habe, möchtest Du ja immer 2 Wörter mit Großbuchstaben zusammen in einer Liste, außer zwischen diesen beiden Wörtern liegt ein Wort mit Kleinbuchstaben...

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Denkow
User
Beiträge: 24
Registriert: Donnerstag 10. Januar 2013, 18:57

mutetella hat geschrieben: Was muss geschehen, wenn ein Wort nicht mit einem Großbuchstaben beginnt?
stimmt, das weiß meine funktion ja noch gar nicht. also muss ich wohl da noch was einfügen.
dann muss meine funktion das wort "ignorieren" und einfach überspringen?!
mutetella hat geschrieben: Wenn ich Dich richtig verstanden habe, möchtest Du ja immer 2 Wörter mit Großbuchstaben zusammen in einer Liste, außer zwischen diesen beiden Wörtern liegt ein Wort mit Kleinbuchstaben...
ganz genau!
BlackJack

@mutetella: Wenn man eine Liste, oder allgemein ein „iterable”, hat und jeweils zwei aufeinander folgende Elemente zu einem Tupel zusammenfassen möchte, dann kann man schon `zip()` dazu verwenden. Allerdings anders als Denkow das getan hat. Ungetestet:

Code: Alles auswählen

def pairwise(iterable):
    iterator = iter(iterable)
    return zip(iterator, iterator)
In Python 2.x kann man `itertools.izip()` verwenden um das ganze „lazy” zu machen.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@BlackJack:
Schon, nur besteht die Aufgabenstellung ja darin, dass nur direkt aufeinander folgende Treffer ein Paar bilden dürfen. Und ich glaube, dass Denkow gerade daran 'hängt'...

Wobei jetzt natürlich interessant wäre, für was das Ergebnis benötigt wird. Ich ahne, dass es darum geht, Vor- und Nachname zu extrahieren. Und ich kann mir jetzt nicht vorstellen, wie das ohne eine gehörige Portion Magie funktionieren kann, Beispiel 'Max von Mustermann'.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
BlackJack

@mutetella: Ui, daran hatte ich gar nicht gedacht. :oops:

Edit: Was gleich die nächste Frage aufwirft was bei mehr als zwei aufeinanderfolgenden Worten mit Grossbuchstaben passieren soll. Max Peter Mustermann. :-)
Denkow
User
Beiträge: 24
Registriert: Donnerstag 10. Januar 2013, 18:57

ja genau daran hänge ich...

solche ausnahmen wie "Max Peter Mustermann" werden jetzt einfach mal ignoriert :D
Antworten