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

Keiner mehr ne Idee? :K
Benutzeravatar
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')]
Benutzeravatar
kbr
User
Beiträge: 1510
Registriert: Mittwoch 15. Oktober 2008, 09:27

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)
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

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