Großbuchstaben ...?
-
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.
-
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?
ab = zip(*[iter(ergebnis[k:]) for k in xrange(n)]) <-- mehr oder weniger diese stelle.
ich verstehe nicht so ganz wieso mir diese zeile jetzt das hier ausgibt:
[('Tina', 'Maier'), ('Maier', 'Max'), ('Max', 'Mustermann')]
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)[('Tina', 'Maier'), ('Maier', 'Max'), ('Max', 'Mustermann')]
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....
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?!
"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.
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.
@Denkow:
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
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')]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
)
stimmt, das weiß meine funktion ja noch gar nicht. also muss ich wohl da noch was einfügen.mutetella hat geschrieben: Was muss geschehen, wenn ein Wort nicht mit einem Großbuchstaben beginnt?
dann muss meine funktion das wort "ignorieren" und einfach überspringen?!
ganz genau!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...
-
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:
In Python 2.x kann man `itertools.izip()` verwenden um das ganze „lazy” zu machen.
Code: Alles auswählen
def pairwise(iterable):
iterator = iter(iterable)
return zip(iterator, iterator)@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
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. 
Edit: Was gleich die nächste Frage aufwirft was bei mehr als zwei aufeinanderfolgenden Worten mit Grossbuchstaben passieren soll. Max Peter Mustermann.
Edit: Was gleich die nächste Frage aufwirft was bei mehr als zwei aufeinanderfolgenden Worten mit Grossbuchstaben passieren soll. Max Peter Mustermann.
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
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')]Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
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)Und hier ist meine:
Ich bin davon ausgegangen, dass zwei nicht direkt aufeinander folgende groß geschriebene Wörter auch berücksichtigt werden sollen, dann halt nicht als Paar...
Wobei die Probleme bei folgendem Satz schon anfangen: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
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
Code: Alles auswählen
>>> print group_uppers('Ist der Max von Mustermann ein Freund von Clara Schumann?')
[['Max'], ['Mustermann'], ['Freund'], ['Clara', 'Schumann?']]Code: Alles auswählen
print group_uppers('Ist der Max von Mustermann Clara Schumanns Freund?')
[['Max'], ['Mustermann', 'Clara'], ['Schumanns', 'Freund?']]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
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit
)
-
BlackJack
@mutetella: Umgekehrt kann's auch passieren wenn Leute Nachnamen haben, die auch als Vornamen gebräuchlich sind. Walter zum Beispiel.
