Anzahl bestimmter Buchstaben in String zählen

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.
Antworten
BMTP
User
Beiträge: 11
Registriert: Samstag 21. November 2015, 11:53

Hallo erstmal,
also ich bin ein echter Neuling was Python angeht und erledige grad Übungsaufgaben und komme bei einer einfach nicht weiter und hoffe ihr könnt mir helfen. Folgende Vorgaben:

1. Dem Programm wird ein String übergeben,der in der Variable s steht
2. drei weitere Variablen sind vorinitialisiert: anzahl_klein , anzahl_groß, anzahl_sonderz
3. die Buchstaben äüöß sind Kleinbuchstaben (gehören also zu anzahl_klein) , ÄÖÜ sind Großbuchstaben, der Rest sind Sonderzeichen.

Nun muss am Ende die Anzahl innerhalb des Strings wiedergegeben werden. Wenn der string also zum Beispiel "äääkkkÜ" wäre, dann wäre anzahl_klein = 3, anzahl_groß = 1 und anzahl_sonderz = 3. Ich weiß, dass ich dies mit print mache.

Ich weiß auch, dass ich mit Hilfe von Schleifen, also for oder while, die Anzahl zählen könnte, aber jedoch weiß ich nicht, wie ich das mit mehreren Buchstaben machen muss und ich stehe jetzt schon eine Weile auf dem Schlauch. Vielleicht kann mir wer helfen oder zumindest eine Idee geben?
Wäre echt super.
BlackJack

@BMTP: Du musst halt eine Schleife über die Zeichen in `s` schreiben und testen ob ein Buchstabe ein Grossbuchstabe, ein Kleinbuchstabe, oder ein Sonderzeichen ist. Einen Test davon musst Du nicht explizit machen, denn nachdem die zwei anderen Tests negativ sind, muss es ja die übrig gebliebene Variante sein. Falls also die Frage nur ist wie man testet ob ein Zeichen in einer Menge von Zeichen enthalten ist, schau Dir mal den ``in``-Operator auf Listen an, beziehungsweise vielleicht auch den Mengendatentyp `set`.
BMTP
User
Beiträge: 11
Registriert: Samstag 21. November 2015, 11:53

Also, um die Aufgaeb etwas zu präzisieren, folgende Vorgaben sind mir dabei gemacht:

Code: Alles auswählen

s = sys.stdin.readline()
anzahl_klein = 0
anzahl_gross = 0
anzahl_sonderz = 0
# ---- Beginn des fehlenden Codes ----
# benutzten der drei Variablen


# ---- Ende des fehlenden Codes ----
print(anzahl_klein)
print(anzahl_gross)
print(anzahl_sonderz)
Was mich halt besonders verwirrt, ist das alle Variablen am Anfang = 0 gesetzt werden, weil egal was ich in der Lücke mache, bekomme ich am Ende nur 3 Nullen heraus. Wenn ich das Programm laufen lasse, muss ich einen String eingeben, z.B. Äpfel und das Ergebnis müsste dann sein:
0
1
4
Zuletzt geändert von Anonymous am Samstag 21. November 2015, 12:47, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
pixewakb
User
Beiträge: 1411
Registriert: Sonntag 24. April 2011, 19:43

Irgendwie gefällt mir deine Aufgabe nicht (Sind normale Kleinbuchstaben tatsächlich Sonderzeichen?) und die Vorgaben sind auch sehr einfach gehalten. Wahrscheinlich hätte ich die 3 Variablen eher in ein Wörterbuch gepackt, aber wahrscheinlich hattet ihr das noch nicht bzw. wird noch nicht in deinem Handbuch behandelt:

Code: Alles auswählen

s = "äääkkkÜ"

anzahl_klein = 0
anzahl_gross = 0
anzahl_sonderz = 0

for a in s:

    if a in "äüöß":
        anzahl_klein += 1
    elif a in "ÄÖÜ":
        anzahl_gross += 1
    else:
        anzahl_sonderz += 1

print(anzahl_klein)
print(anzahl_gross)
print(anzahl_sonderz)
Du müsstest Dir mal die for-Schleife und die if-elif-else-Anweisung ansehen. Das fehlt dir aktuell wohl noch.
BlackJack

@pixewakb: Da müsste man aber noch dazu schreiben dass das Python 3 ist, denn in Python 2 wäre das fehlerhaft.

Edit: Und Du hast da gerade jemandem seine Hausaufgabe komplett gelöst. ;-)
BMTP
User
Beiträge: 11
Registriert: Samstag 21. November 2015, 11:53

@pixewakb: Danke für die Hilfestellung, jedoch scheint es immernoch einen Fehler zu geben bei anzahl_sonderz wird nicht korrekt gezählt, sondern immer 1 mehr als wirklich da ist. Also z.B. wenn ich ääÖÖ eingebe, komm bei Anzahl_sonderz 1 und nicht 0.

Und das ist keine Hausaufgabe, sondern eine Übungssammlung die es bei uns in der Uni gibt, mit ganz vielen solchen Aufgaben.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@BMTP
Noch so ein Mysterium:

Code: Alles auswählen

>>> len('a')
1
>>> len('ä')
2
Ein 'ä' ist intern eben nicht nur ein Zeichen, sondern wird über zwei Bytes repräsentiert:

Code: Alles auswählen

>>> bytes('ä')
'\xc3\xa4'
Beschäftige Dich einmal mit Encoding, dann wird Dir das klarer.
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
BlackJack

@BMTP: Das Ergebnis ist schon korrekt so denn Du gibst ja nicht nur ääÖÖ ein. Du gibst da noch etwas ein bevor das Programm anfängt zu zählen, und das wird natürlich auch mitgezählt. Überleg mal genau welche Tasten Du da drückst.
BMTP
User
Beiträge: 11
Registriert: Samstag 21. November 2015, 11:53

Ja , würde ich jetzt normalerweise auch denken, aber wir haben eine Plattform wo wir soetwas hochladen können (DomJudge falls das jemand kennt) wo die Aufgabe automatisch kontrolliert wird und irgendwie wird es als falsch gewertet. Trotzdem Danke für die Hilfe.

Eine allgemeine Frage hätte ich aber noch: for - Schleifen sind ja eigentlich explizit für Listen innerhalb von Python. Jetzt ist es jedoch so, dass ich ja eigentlich einen String eingebe. Muss ich dann vorher s.split() eingeben, um daraus eine Liste zu machen? :o
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Probiers doch einfach aus. Dafür existiert der interaktive Interpreter. ;)
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
BlackJack

@BMTP: ``for``-Schleifen sind nicht nicht für Listen. Nach dem ``in`` kann jedes Objekt benutzt werden das iterierbar ist. Das sind Listen, aber das sind auch viele andere Datentypen. Zeichenketten, Bytearrays, Dateiobjekte, Wörterbücher, Mengen — um mal ein paar Grunddatentypen zu nennen. Aber auch viele andere Objekte aus der Standardbibliothek. Und man kann auch eigene Datentypen programmieren über die man mit ``for`` iterieren kann. Ausserdem gibt es Generatorausdrücke- und Funktionen die ebenfalls ein iterierbares Ergebnis liefern was keine Liste ist.
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

BlackJack hat geschrieben:@pixewakb: Da müsste man aber noch dazu schreiben dass das Python 3 ist, denn in Python 2 wäre das fehlerhaft.
mutetella hat geschrieben:@BMTP
Ein 'ä' ist intern eben nicht nur ein Zeichen, sondern wird über zwei Bytes repräsentiert:
Dann sollte man umgekehrt auch darauf hinweisen, dass das nur für Python 2 gilt; in Python 3 ist es, wie man es intuitiv erst mal auch erwarten würde, nur ein Zeichen. Aufgrund der Verwendung der Print-Funktion ohne __future__ Import im vorgegebenen Code hätte ich jetzt angenommen, dass das die Version ist, die verwendet wird.
BlackJack

@nezzcarth: Die Grenze zwischen `print()`-Funktion und ``print``-Anweisung mit unnötigen Klammern ist fliessend. Solange da nur ein Argument/Wert steht, gehe ich davon aus dass das kein eindeutiger Hinweis ist. Es gab hier schon öfter Leute die Klammern auch in Python 2 gesetzt haben. Ohne den passenden `__future__`-Import.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@nezzcarth
Grundsätzlich hast Du Recht. Allerdings weist das vom OT nicht erwartete Verhalten eindeutig darauf hin, dass er wohl Python 2 verwendet.
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@mutetella: das nicht erwartete Verhalten weißt auf etwas ganz anderes hin, was BlackJack nämlich schon angesprochen hat. Es ist genau ein Zeichen zu viel und nicht etwa 4, wie man bei falschem Encoding erwarten könnte.
Antworten