PYTHON - Zählen wie oft Buchstabe in einer Zeichenkette vorkommt?

3 Antworten

Die Lösungsbausteine hast du doch bereits in der Aufgabe bekommen: Dictionary anlegen und die benannten Kontrollstrukturen verwenden.

Überleg dir mal Schritt für Schritt, wie du vorgehen würdest, wenn du die Anzahl eines Buchstaben in einem Text ermitteln solltest. Formuliere genau diesen Vorgang in Text- / Stichpunktform und wandel ihn Schritt für Schritt in einen Algorithmus / Pseudo-Code um (abstrahiere ihn also). Wenn du das hast, kannst du den Code in die Python-Sprache übersetzen.

noskill187  07.11.2017, 03:49

Hätte ich auch so empfohlen.

Bin zwar ebenfalls Programmier-  bzw. Pythonneuling, aber als am hilfreichsten empfand ich es immer erstmal genau zu definieren was eingegeben und was am Ende ausgegeben werden soll. (soll heissen genau zu wissen was das Programm eigentlich tun soll)

Von da aus dann die einzelnen Schritte definieren, die dazwischen zu geschehen haben um die Eingabe in die gewünschte Ausgabe "umzuwursten".

Das dann jeweils Schritt für Schritt umsetzen.
Ich überprüf das immer gerne mit print() Befehlen, ob auch tatsächlich ausgegeben/weitergegeben wird was ich mir vorstell und hangel mich dann zur fertigen funktionierenden Lösung durch (meist führen viele Wege nach Rom... kurze, lange, gute, schlechte...).

1

Naja, mit For schaust Du Dir die einzelnen Zeichen Deines strings an, mit if in schaust Du ob, ob der aktuelle Buchstabe in Deiner Suchbustabenmenge ist.

Es wird Dir ja förmlich schon die Lösung geliefert (Dictionary verwenden).

KaminariMantsu 
Fragesteller
 07.11.2017, 01:10

Ich hab leider keine Ahnung wie das dann aussehen soll.

Bin noch ziemlich neu auf dem Gebiet...

Danke trotzdem!

0
KarlRanseierIII  07.11.2017, 01:19
@KaminariMantsu

Eine fertige Lösung hilft Dir ja nicht. Aber schau Dir einfach mal folgendes Beispiel an:

text="Das ist ein beliebiger String"

for letter in text:

    print(letter)

Ein Dictionary ist ein Hash (Schlüssel/Wert) .... na vielleicht sollte ich mir darin notieren wie häufig welcher Buchstabe vorkommt.

histogramm={'g': 9, 'f':2, 'z':1}

So könnte Dein Dictionary am Ende aussehen, bevor Du es ausgibt, hier wären die Suchbuchstaben g,f und z.

Jetzt mußt Du Dir das nur noch passend zusammenkleben.

Jetzt mußt Du nur überlegen:

Wie initialisiere ich das dictionary sinnvoll (Hier brauchst Du ein for in)?

Wie durchlaufe ich den text? (Siehe oben)

Wie aktualisiere ich es (hier brauchst Du unter anderem ein if in)

1
KaminariMantsu 
Fragesteller
 07.11.2017, 19:23
@KarlRanseierIII

Ich glaube soweit habe ich das Beispiel jetzt dann doch lösen können und meine Schleifen funktionieren auch.

Das einzige was ich nicht recht schaffe ist, den String 

buchstaben = "abc" 

zu teilen, sodass ich a, b und c jeweils einzeln extrahieren kann.

Ich habe es bereits mit ".split" versucht, aber komme auf kein Ergebnis..

Hättest du da vielleicht noch einen Vorschlag?

0
KarlRanseierIII  07.11.2017, 20:03
@KaminariMantsu

Okay, also, wir nehmen mal die Aufgabe, Zähle folgende Buchstaben 'abc' händisch mit Stift und Zettel. Wie gehen wir vor?

Wir legen eine Strichliste an (der Einfachheit halber), für jeden der Buchstaben (ich schreibe also vorne den Buchstaben hin) und mache daneben Striche.

In Deinem Programm wirst Du natürlich nicht Striche machen, sondern einfach durch Erhöhung um 1 mitzählen.

Also nehmen wir an needle='abc'.

Dann möchte ich für jeden der Buchstaben einen Schlüssel in meiner 'Strichliste' hier verkörpert durch ein Dictionary anlegen:

for letter in 'abc':

   hist[letter]=0

(Sei hist ein vorher instanziiertes, aber leeres dictionary)

Ich sorge also dafür das für jeden Suchbuchstaben ein Schlüssel, mit dem Wert 0 (Keine Auffindungen) initialisiert wird.

So kann ich mit dann später prüfen, ob der aktuelle Buchstabe meines Textes *IN* der Schlüsselliste ist und *FALLS JA* den Wert des zugehörigen Schlüssels um 1 erhöhen.

Voila, meine Strichliste ist algorithmisch beschrieben.

Jetzt muß Du das alles nur noch mit den Sprachmitteln von Python abbilden und Python macht es Dir hier ausgesprochen leicht.

1
Meinst du so etwas?
buchstaben = 'abc'
text = 'Der total verkorkste GF-Editor macht mich waaaahnsinnig!'.lower()

stats = dict((c, text.count(c)) for c in buchstaben if c in text)
print(stats)

Ich habe mal ans Ende des Initialisierungsstrings von "text" ein ".lower()" rangehängt, weil sonst keine Großbuchstaben berücksichtigt werden. Das steht so aber nicht in der Aufgabenstellung, also wird es dein Lehrer entweder monieren, oder honorieren ... je nachdem welcher "Typ" Entwickler dein Lehrer ist. :)

Außerdem kannst du das Dictionary natürlich noch schick sortiert und formatiert ausgeben, aber das ist ja nicht Teil der Aufgabenstellung. (Siehe dazu das zweite Beispiel weiter unten!)

Und "buchstaben" sollte möglichst kein String, sondern ein frozenset() sein, falls es meistens mehr als 8 Buchstaben sind, aber so ein Performance-Kram ist in dem Falle hier vermutlich sowieso schnurz. :)

Und zuguter letzt, sollten die Variablennamen englische Bezeichner tragen, also statt "buchstaben" vielleicht "chars". Aber da es sich wohl nur um eine Hausaufgabe handelt, wollen wir mal nicht so sein, ne? :)

Übrigens gibt es genau dafür bereits die Counter-Klasse aus dem collections-Modul:

from collections import Counter

buchstaben = 'abc'
text = 'Der total verkorkste GF-Editor macht mich waaaahnsinnig!'.lower()

stats = Counter(text).most_common()

for c, i in sorted(stats, key=lambda t: t[0]):
if c in buchstaben:
print('%c: %d' % (c, i))

Es gibt noch X weitere Möglichkeiten deine Aufgabe zu lösen, mit und ohne weitere Zusatzmodule. Aber ich denke, beide obigen Varianten sind akzeptabel. Die erste funktionale kannst du natürlich auch imperativ umsetzen, wie im zweiten Beispiel ... oder umgekehrt.

Naja, viel Erfolg! :)
KarlRanseierIII  07.11.2017, 20:12

Ich denke nicht, daß bei einer Anfängeraufgabe gleich mit syntaktischen Zucker geworfen werden muß.

Es gäbe sicherlich noch andere dreckige Lösungen, z.B. ein filter() auf den Suchbuchstaben mit Labmda und dann die Länge abfragen.

Ich glaube nur nicht, daß das zum Lernerfolg bei Anfängern beiträgt ;-). Vor allem, da es eigentlich für solche Ansätze kein dictionary braucht (auch Deine Lösung 1 braucht eigentlich kein dictionary).

Von daher plädiere ich für einen rustikal-imperativen Ansatz, bei diesem ergibt die Nutzung des Dictionaries deutlich mehr Sinn.

1