Anzahl eines bestimmten Zeichens in einer Satzzeile ausgeben

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
Artur
User
Beiträge: 47
Registriert: Freitag 21. Oktober 2011, 10:55

Freitag 21. Oktober 2011, 11:09

Tag liebes Forum

Ich bin neu hier und entschuldige mich schon mal für alles was ich falsch mache, doch die Zeit ist knapp :-)
Ich habe schon eine Zeit lang gegooglet und in meine Lehrscripts geguckt aber keine Lösung auf mein Problem gefunden!

Der Aufgabenteil lautet:

- Geben Sie folgenden Text als String aus, wobei zwischen beiden Satzteilen in der
Ausgabe eine Leerzeile stehen soll.
<Liedertext:“Drei Chinesen mit dem Kontrabass, spielten auf der Strasse und
erzaehlten sich was.“>
- Geben Sie aus, wie oft der Teilstring “i“ im Text enthalten ist.
- Ersetzen Sie alle anderen Vokale durch ein “i“.

Den Text mit den Chinesen auszugeben ist ja kein Problem aber wie gebe ich aus wieviele "i" in ihm enthalten sind? Ich weiß nur wie man die Zeichenanzahl mit len(...) ausgibt aber nicht wie ich ausgebe, wieviele "i" der Text hat. Und wie ersetze ich alle anderen Vokale durch ein "i" ? :K
Bin superhappy, wenn mir jemand helfen kann.
Danke im Voraus.

LG
Artur
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Freitag 21. Oktober 2011, 11:12

Du suchst die String-Methoden "count" und "replace": http://docs.python.org/library/stdtypes ... ng-methods

Schöne Grüße,

brb
Artur
User
Beiträge: 47
Registriert: Freitag 21. Oktober 2011, 10:55

Freitag 21. Oktober 2011, 12:08

Hey, schon mal danke für die schnelle Antwort. Ich habe noch Probleme den Befehl richtig einzugeben.

str.count(sub[, start[, end]])¶

Also wenn mein Satz von Zeile 26 bis 27 geht muss ich doch theoretisch:
str.count("i"[, 26[, 27]])¶ eingeben, oder? Ich hab auch versucht das str. und das ¶ wegzumachen aber es klappt nicht.
Was mache ich falsch? console sagt:

print count("i"[, 26[, 27]])¶
^
SyntaxError: invalid syntax

Sry, für die Umstände, ich weiß halt nicht wie das genau funzt

Edit: Und wie benutze ich den replace-Befehl oO? Was muss ich denn für die Vokale eingeben?
deets

Freitag 21. Oktober 2011, 12:12

Du musst die eckigen Klammern weglassen, und brauchst auch start und ende nicht.

Die Notation in der Dokumentation mit den eckigen Klammern ist keine Syntax, sondern beschreibt, dass start und end optionale Argumente sind.

Code: Alles auswählen

>>> "abcdefg".count("a")
1
>>>  "abcdefg".count("a", 1) # 0, weil der string bei 0 beginnt, aber die suche erst ab 1 (also dem b)
0
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Freitag 21. Oktober 2011, 12:17

Die Start- und Ende-Parameter haben nichts mit Zeilen zu tun! Es geht um die Indexposition innerhalb eines Strings. Du solltest Dir mal die Grundlagen von Strings angucken, insbesondere das "Slicing". Damit sollte Dir das klarer werden.

Deine Aufrufe sind - gelinde gesagt - unsinnig! Das sind komplette Grundlagen. Du übergibst Parameter nicht mit komischen eckigen Klammern, sondern simpel durch Kommata getrennt. Das sollte man doch selbst als Neuling schnell gemerkt haben, oder?

Die Angabe in der Doku ist nur eine spezielle Syntax, die verdeutlichen soll, dass die Parameter `start` und `end` optional sind. Du kannst sie angeben (oder auch nur den `start`-Parameter ohne den `end`-Parameter), musst es aber nicht.

Ich habe ja fast die Vermutung, dass Ihr das ganze ohne diese Methoden lösen und alles über eine simple Schleife lösen sollt. Aber da wir den Kontext nicht kennen, kann man dazu wenig sagen. Generell ist die Verwendung der dafür vorgesehenen Funktionen natürlich sinnvoller - sofern es auf die Produktivität ankommt.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3))
assert encoding_kapiert
Artur
User
Beiträge: 47
Registriert: Freitag 21. Oktober 2011, 10:55

Freitag 21. Oktober 2011, 12:50

Es klappt jetzt alles, bis auf das replace der Vokale. Ein Vokal kann ich ersetzen. Ist es möglich mehrere zu ersetzen?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Freitag 21. Oktober 2011, 12:53

Artur hat geschrieben:Ist es möglich mehrere zu ersetzen?
Ja!...
...
Aber wo liegt das Problem? Wenn Du die Methode doch einmal bereits erfolgreich angewendet hast, dann schaffst Du das doch auch sicher ein zweites Mal!

(Wobei Du doch laut Aufgabenstellung nur einen Vokal ersetzen musst?!?)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3))
assert encoding_kapiert
Artur
User
Beiträge: 47
Registriert: Freitag 21. Oktober 2011, 10:55

Freitag 21. Oktober 2011, 13:00

-Ersetzen Sie alle anderen Vokale durch "i".

Es ist bestimmt möglich str.replace("e","i") 3 oder 4 mal nacheinander einzutippen, was sehr viel Platz füllt. Ich wollte jetzt wissen, ob ich mit einem Befehl ALLE Vokale mit "i" ersetzen kann.
BlackJack

Freitag 21. Oktober 2011, 13:03

@Artur: Statt es mehrmals zu schreiben könntest Du eine Schleife über die Vokale schreiben, die für jeden Schleifendurchlauf das Ersetzen einmal ausführt.

Mit einem Funktionsaufruf ginge es mit `re.sub()`, aber reguläre Ausdrücke möchtest Du Dir am Anfang vielleicht nicht unbedingt antun.

Mit einem *Befehl* geht es nicht. Wäre auch komisch wenn Python ausgerechnet dafür einen extra Befehl hätte.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Freitag 21. Oktober 2011, 13:19

Artur hat geschrieben:-Ersetzen Sie alle anderen Vokale durch "i".
Stimmt, sorry, mein Fehler.
Artur hat geschrieben: Es ist bestimmt möglich str.replace("e","i") 3 oder 4 mal nacheinander einzutippen, was sehr viel Platz füllt.
Also ich hätte da eine Lösung mittels lambda parat - die braucht zwei Zeilen ;-)

Aber an Deiner Stelle würde ich mal BlackJacks Tipp weiterverfolgen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3))
assert encoding_kapiert
Artur
User
Beiträge: 47
Registriert: Freitag 21. Oktober 2011, 10:55

Freitag 21. Oktober 2011, 13:29

Aww wie schreibe ich denn jetzt eine Schleife? Ich denke ich warte einfach auf die nächste Vorlesung, der prof wird es mir schon zeigen. Wollte ein bischn vorarbeiten. Danke an alle für die Hilfe :-)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Freitag 21. Oktober 2011, 13:33

Artur hat geschrieben:Aww wie schreibe ich denn jetzt eine Schleife? Ich denke ich warte einfach auf die nächste Vorlesung, der prof wird es mir schon zeigen. Wollte ein bischn vorarbeiten. Danke an alle für die Hilfe :-)
Das ist ja sehr löblich. Aber wieso so schnell aufgeben?

Du solltest Dir einfach mal das offizielle Tutorial angucken! Darin werden alle grundlegenden Themen, wie Kontrollstrukturen (darunter fallen Schleifen) und grundlegende Datenstrukturen (darunter fallen eben Listen und Strings) besprochen. Ich denke damit kommst Du recht schnell auf die Lösung Deiner Probleme.

Ich frage mich nur, wieso ihr einen Aufgabenzettel bekommt, für den Konzepte notwendig sind, die ihr noch nicht besprochen habt? Oder ist die Abgabe so terminiert, dass die kommenden Vorlesungen die Grundlagen noch schaffen können?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3))
assert encoding_kapiert
Antworten