ubuntuusers.de

[Python] Die Anzahl der kleinen Buchstaben aus einen vorgegebenen Text zählen, aber wie?

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

nox24

Avatar von nox24

Anmeldungsdatum:
8. Februar 2008

Beiträge: 1260

Wohnort: /home/karlsruhe/

Hallo User,

ich bin gerade am Windows Rechner und lerne in der Firma wie man python programmiert.

Dort ist eine Aufgabenstellung:

How many lowercase letters are there in the following paragraph?

Es gibt einen langen Text und ich muss daraus ein Script schreiben. Funktion: Nur alle kleinen Buchstaben aus dem Text zählen und ausgeben. Wie mach ich das?

Danke!

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

Ich denke nicht, dass Dir hier jemand Deine Hausaufgaben erledigen wird. Zeige, wie weit Du bis jetzt gekommen bist, und stelle konkrete Fragen. Falls Du keinen Einstieg findest, dann teile das Problem in Teilprobleme auf, und lese die Python-Dokumentation, um Möglichkeiten zu finden, diese Probleme separat zu lösen.

Ein Einstieg wäre beispielsweise, erst mal herauszufinden, wie man alle Buchstaben eines beliebigen Texts durchgehen könnte.

nox24

(Themenstarter)
Avatar von nox24

Anmeldungsdatum:
8. Februar 2008

Beiträge: 1260

Wohnort: /home/karlsruhe/

Ist ehrlich gesagt ein Einstellungstest mit solch Aufgaben. Bitte helft mir. Ich muss nur die kleinen Buchstaben aus einem Text zählen lassen. Wie soll ich da anfangen?

Hab schon so versucht:

import string

x = '''Die ist ein Testtext'''
x = string.lowercase
print x(str)

Ich weiß es ist ein Mist was ich da mache. Bitte um Hilfe.

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

@nox24: Ich habe Dir gesagt, wie Du anfangen kannst: Finde erst mal eine Lösung, um alle Buchstaben eines Texts durchzugehen. Das ist nicht schwer, und lässt sich bereits nach dem Durcharbeiten des Python-Tutorials programmieren. Wenn Du das geschafft hast, dann können wir weiter machen ...

Wenn Du eine fertige Lösung willst, dann bezahle dafür.

nox24

(Themenstarter)
Avatar von nox24

Anmeldungsdatum:
8. Februar 2008

Beiträge: 1260

Wohnort: /home/karlsruhe/

Also ich habe da was ausprobiert:

lowercase = '''Dies ist ein Testtext worin alle vorkommenden kleinen a Buchstaben gezählt werden'''
 
count = 0 
for char in lowercase: 
  if char == 'a': 
    count = count + 1 
print count

Naja und wie kann ich ganzen Bereich von kleinen Buchstaben angeben, also a-z?

if char == 'a-z':

nimmt er nicht an. Bitte hilft mir.

BodomBeachTerror

Anmeldungsdatum:
24. März 2008

Beiträge: 788

char.islower() ?

adun Team-Icon

Avatar von adun

Anmeldungsdatum:
29. März 2005

Beiträge: 8606

Eine Google Suche nach "character counting python lower" spuckt diverse Skripte aus, falls das noch nicht reicht. 😉

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

@nox24: Lies doch bitte endlich mal das Tutorial und die Dokumentation, anstatt blind zu raten und wild rumzuprobieren ...

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Da er es ja sicherlich erklären können muss, hier mal eine fortgeschrittenere Version (mit der er im Moment sicher nicht viel anfangen können wird):

1
2
3
4
In [9]: data = u'''Dies ist ein Testtext worin alle vorkommenden kleinen a Buchs
taben gezählt werden'''

In [10]: sum([char.islower() for char in data])

Ich hoffe Lunar nimmt mir das jetzt nicht übel ☺

@nox24: Die for-Schleife ist schon mal ein Ansatz. Eine Methode, wie man erkennen kann, ob es ein kleiner Buchstabe ist, wurde ja schon oben genannt und von mir eingesetzt. Nun musst Du innerhalb der for-Schleife eben nur noch testen, ob es ein Kleinbuchstabe ist und dann irgend wie "hochzählen".

Dein Name für die Daten ist übrigens nicht so toll, denn in dem String sind ja gar nicht ausschließlich Kleinbuchstaben!

nox24

(Themenstarter)
Avatar von nox24

Anmeldungsdatum:
8. Februar 2008

Beiträge: 1260

Wohnort: /home/karlsruhe/

So, nun bin ich daheim und muss auch schon bald schlafen gehen. Bis 19 Uhr in der Firma geblieben. Morgen um 9 Uhr geht mein Praktikum weiter...
Lunar schrieb:

@nox24: Ich habe Dir gesagt, wie Du anfangen kannst: Finde erst mal eine Lösung, um alle Buchstaben eines Texts durchzugehen. Das ist nicht schwer, und lässt sich bereits nach dem Durcharbeiten des Python-Tutorials programmieren. Wenn Du das geschafft hast, dann können wir weiter machen ...

Ja ich werde mir viel Mühe geben. Ich weiß, dass Python eine inzwischen sehr beliebte und elegante Programmiersprache ist.

Wenn Du eine fertige Lösung willst, dann bezahle dafür.

Bezahlen? Niemals. 😛

adun schrieb:

Eine Google Suche nach "character counting python lower" spuckt diverse Skripte aus, falls das noch nicht reicht. 😉

Ich fand nichts auf Anhieb was für mich die fertige Lösung darstellt.
BodomBeachTerror schrieb:

char.islower() ?

Ok, ich werde darüber lesen.
Lysander schrieb:

Da er es ja sicherlich erklären können muss, hier mal eine fortgeschrittenere Version (mit der er im Moment sicher nicht viel anfangen können wird):

1
2
3
4
In [9]: data = u'''Dies ist ein Testtext worin alle vorkommenden kleinen a Buchs
taben gezählt werden'''

In [10]: sum([char.islower() for char in data])

Hast Recht. Ich habe diese mal getestet und da kamen lauter Syntax Fehler. was bedeuten die Stellen "In [9]:" und "In [10]:" ?

@nox24: Die for-Schleife ist schon mal ein Ansatz. Eine Methode, wie man erkennen kann, ob es ein kleiner Buchstabe ist, wurde ja schon oben genannt und von mir eingesetzt. Nun musst Du innerhalb der for-Schleife eben nur noch testen, ob es ein Kleinbuchstabe ist und dann irgend wie "hochzählen".

Naja ich muss zugeben, dass ich mit Python erst seit ca. 5 Tagen zum ersten mal konfrontiert bin.

Dein Name für die Daten ist übrigens nicht so toll, denn in dem String sind ja gar nicht ausschließlich Kleinbuchstaben!

Stimmt. Sorry.

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

nox24 schrieb:

Hast Recht. Ich habe diese mal getestet und da kamen lauter Syntax Fehler. was bedeuten die Stellen "In [9]:" und "In [10]:" ?

Das sind nur die Ausgaben der ipython-Shell! Einfach weglassen und den Rest testen - dann klappt's auch 😉

nox24

(Themenstarter)
Avatar von nox24

Anmeldungsdatum:
8. Februar 2008

Beiträge: 1260

Wohnort: /home/karlsruhe/

Vielen Dank Lysander und Danke auch an die anderen. ☺

Problem gelöst. Jetzt muss ich nur noch nachschauen in welchem deutschen Tutorial ich die Erklärungen finde.

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

nox24 schrieb:

Problem gelöst. Jetzt muss ich nur noch nachschauen in welchem deutschen Tutorial ich die Erklärungen finde.

OMG... Du warst mit Deinem Ansatz doch schon fast am Ziel! Wieso willst Du meine Lösung als die Deine ausgeben? Da wird jeder Ausbilder sofort merken, dass es nicht von Dir stammt 😉

Solltest Du anhand von Tutorials das ganze wirklich kapieren ist es ja so weit ok - aber mit so viel Engagement, wie dafür notwendig ist, hättest Du das ganze auch locker selber gelöst 😛

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

Die LC ist übrigens unnötig:

1
2
3
4
In [1]: s = "Dies ist ein Test"

In [2]: sum(char.islower() for char in s)
Out[2]: 12

Im Übrigen mal wieder ein schönes Beispiel für einen faulen Studenten/Schüler, der bald auf die Nase fallen wird und sich nochmal überlegen sollte, ob er wirklich so durch den Kurs kommen will. Den Eifer merkt man schon allein daran, dass nichts hinterfragt, sondern die ganze Sache mit einem "Danke, werde mir das bei Gelegenheit mal näher ansehen" quittiert wird.

Barabbas

Avatar von Barabbas

Anmeldungsdatum:
31. März 2007

Beiträge: 1651

Wohnort: Münster

Lysander schrieb:

Da er es ja sicherlich erklären können muss, hier mal eine fortgeschrittenere Version (mit der er im Moment sicher nicht viel anfangen können wird):

1
2
3
4
In [9]: data = u'''Dies ist ein Testtext worin alle vorkommenden kleinen a Buchs
taben gezählt werden'''

In [10]: sum([char.islower() for char in data])

Ich finde die Lösung zwar raffiniert - aber nicht besonders empfehlenswert. Gezählt werden sollen die kleinen Buchstaben. Hier wird aber eine Liste mit Bools erstellt und die Summe deren Int-Werte berechnet. Nun sind Bools zwar Untertypen von Ints - dennoch halte ich es nicht für optimal, das Vorgehen so zu verschleiern. In anderen Sprachen haben False und True ja teilweise auch andere Int-Werte, wenn ich mich nicht irre (-1?). Das alles macht die Sache nicht unbedingt offensichtlich: "Erstelle eine Liste mit Wahrheitswerten bzgl. der Groß-/Kleinschreibung und gebe die Summe dieser Wahrheitswerte aus."
Wenn überhaupt würde ich schreiben:

 u'''Dies ist ein Testtext worin alle vorkommenden kleinen a Buchstaben gezählt werden'''
len([char for char in data if char.islower()])

Diese Lösung finde ich pythonischer, weil sie genau das macht, was gemacht werden soll: "Packe alle Kleinbuchstaben in eine Liste und gebe deren Länge aus."

Letztendlich sind aber beide Lösungen falsch, weil sie nicht die korrekte Anzahl der kleinen Buchstaben ausgeben: islower() gibt bei Umlauten etc. False zurück. Auf das korrekte Ergebnis kommt man beispielsweise mit dieser RE:

import re
u'''Dies ist ein Testtext worin alle vorkommenden kleinen a Buchstaben gezählt werden'''
len(re.findall(r"[a-zäöüß]", data))

Eine generische Lösung haben wir damit aber noch immer nicht: "é" etc. will man ja ggf. auch noch unterschieden wissen. Und hier auf Verdacht alle möglichen kleinen Buchstaben mit verschiedenen Akzenten in die RE aufzunehmen, scheint auch nicht das gelbe vom Ei zu sein.

Besten Gruß,

brb

Antworten |