Seite 2 von 3
Re: Großbuchstaben ...?
Verfasst: Dienstag 15. Januar 2013, 13:47
von 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.
Re: Großbuchstaben ...?
Verfasst: Dienstag 15. Januar 2013, 14:41
von Denkow
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
Re: Großbuchstaben ...?
Verfasst: Dienstag 15. Januar 2013, 14:47
von 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?
Re: Großbuchstaben ...?
Verfasst: Dienstag 15. Januar 2013, 14:56
von Denkow
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')]
Re: Großbuchstaben ...?
Verfasst: Dienstag 15. Januar 2013, 15:02
von sparrow
Dann erkläre doch mal, was eben diese Zeile macht, und wann du denkst, dass sie ausgeführt wird.
Re: Großbuchstaben ...?
Verfasst: Dienstag 15. Januar 2013, 15:09
von Denkow
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....
Re: Großbuchstaben ...?
Verfasst: Dienstag 15. Januar 2013, 15:42
von sparrow
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.
Re: Großbuchstaben ...?
Verfasst: Dienstag 15. Januar 2013, 15:55
von Denkow
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?!
Re: Großbuchstaben ...?
Verfasst: Dienstag 15. Januar 2013, 15:56
von 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.
Re: Großbuchstaben ...?
Verfasst: Dienstag 15. Januar 2013, 15:59
von mutetella
@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
Re: Großbuchstaben ...?
Verfasst: Dienstag 15. Januar 2013, 16:07
von Denkow
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!
Re: Großbuchstaben ...?
Verfasst: Dienstag 15. Januar 2013, 16:24
von 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.
Re: Großbuchstaben ...?
Verfasst: Dienstag 15. Januar 2013, 17:19
von mutetella
@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
Re: Großbuchstaben ...?
Verfasst: Dienstag 15. Januar 2013, 17:26
von BlackJack
@mutetella: Ui, daran hatte ich gar nicht gedacht.
Edit: Was gleich die nächste Frage aufwirft was bei mehr als zwei aufeinanderfolgenden Worten mit Grossbuchstaben passieren soll. Max Peter Mustermann.

Re: Großbuchstaben ...?
Verfasst: Dienstag 15. Januar 2013, 17:48
von Denkow
ja genau daran hänge ich...
solche ausnahmen wie "Max Peter Mustermann" werden jetzt einfach mal ignoriert

Re: Großbuchstaben ...?
Verfasst: Dienstag 15. Januar 2013, 18:41
von Denkow
Keiner mehr ne Idee? :K
Re: Großbuchstaben ...?
Verfasst: Dienstag 15. Januar 2013, 18:48
von cofi
Da es mich in den Fingern gejuckt hat:
Code: Alles auswählen
In [3]: def proper_noun_pairs(words):
pairs = []
current = []
for word in words:
if word[0].isupper():
current.append(word)
else:
current = []
if len(current) == 2:
pairs.append(tuple(current))
current = []
return pairs
In [4]:proper_ noun_pairs("Max Mustermann ging in den Boesen Wald hinein".split())
Out[4]: [('Max', 'Mustermann'), ('Boesen', 'Wald')]
Re: Großbuchstaben ...?
Verfasst: Dienstag 15. Januar 2013, 19:21
von kbr
Noch 'ne Variante:
Code: Alles auswählen
def get_uppercase_pairs(sentence):
pairs = []
previous = ' '
for word in sentence.split():
if word[0].isupper() and previous[0].isupper():
pairs.append((previous, word))
previous = word
return pairs
sentence = "Max Mustermann ging in den Boesen Wald hinein"
print get_uppercase_pairs(sentence)
Re: Großbuchstaben ...?
Verfasst: Dienstag 15. Januar 2013, 19:53
von mutetella
Und hier ist meine:
Code: Alles auswählen
def group_uppers(sentence):
result = []
pair = []
for word in sentence.split()[1:]:
if word[0].isupper():
pair.append(word)
else:
if pair:
result.append(pair)
pair = []
if len(pair) == 2:
result.append(pair)
pair = []
if pair:
result.append(pair)
return result
Ich bin davon ausgegangen, dass zwei nicht direkt aufeinander folgende groß geschriebene Wörter auch berücksichtigt werden sollen, dann halt nicht als Paar...
Code: Alles auswählen
>>> print group_uppers('Ist der Max von Mustermann ein Freund von Clara Schumann?')
[['Max'], ['Mustermann'], ['Freund'], ['Clara', 'Schumann?']]
Wobei die Probleme bei folgendem Satz schon anfangen:
Code: Alles auswählen
print group_uppers('Ist der Max von Mustermann Clara Schumanns Freund?')
[['Max'], ['Mustermann', 'Clara'], ['Schumanns', 'Freund?']]
Weshalb ich den ganzen Ansatz für völlig verkehrt halte.
Ich glaube, ohne ein Wörterbuch, das möglichst alle Vornamen enthält, kommt man nicht wirklich weiter. Selbst dann lässt sich bei 'Das ist das Zimmer vom Nikolaus' kaum zwischen dem Nachnamen 'Zimmer' und dem Substantiv 'Zimmer' unterscheiden.
mutetella
Re: Großbuchstaben ...?
Verfasst: Dienstag 15. Januar 2013, 20:15
von BlackJack
@mutetella: Umgekehrt kann's auch passieren wenn Leute Nachnamen haben, die auch als Vornamen gebräuchlich sind. Walter zum Beispiel.