Substrings 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
mike7777
User
Beiträge: 3
Registriert: Montag 25. Januar 2016, 17:02
Kontaktdaten:

Hallo,

ich soll einen Code schreiben der zwei input Strings mitbringt und
dann zählen wie oft der erste in dem zweiten String vorkommt.
Wie macht man das? Habe mir darüber schon längere Zeit den Kopf
zerbrochen. Und es sind auch keine Hausaufgaben, lerne Python freiwillig.

Code: Alles auswählen

Nadel=input()
Heuhaufen=input()
S=''
counter=0
z=''
for i in range(0,len(Heuhaufen)):
   S=Heuhaufen
   x=S[i]
   z=x+S[i]
   if x == Nadel:
      z=S[0:i]
for j in range(0, len(Nadel)):
   x=S[j]
   if x == z:
      counter=counter+1
print(counter)
print(x)
print(z)
VG

Mike
Zuletzt geändert von Anonymous am Montag 25. Januar 2016, 17:16, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Goethe:

"Jede Lösung eines Problems ist ein neues Problem."
BlackJack

@mike7777: Du *sollst* einen Code schreiben und „freiwillig“ klingt irgendwie widersprüchlich. ;-)

Wenn es nicht-überlappende Vorkommen sein sollen, dann verwende einfach die `count()`-Methode auf Zeichenketten.

Ansonsten wäre es ein Anfang wenn Du eine Funktion für die Aufgabe schreiben würdest, die man dann auch gleich mal mit ein paar Beispielen aufrufen kann, damit wir sehen was tatsächlich gefragt ist, und Du Tests hast ob das tut was es soll, ohne jedes mal die wahrscheinlich gleichen Eingaben von Hand machen zu müssen.

Wenn die Vorkommen überlappend sein dürfen, dann muss man sich eine Funktion schreiben die für jede potentiell mögliche Stelle im Heuhaufen testet ob die Nadel dort steht. Übliches vorgehen ist es Probleme auf kleinere Teilprobleme herunter zu brechen. Zum Beispiel ein Test ob die Nadel an einem gegeben Index im Heuhaufen steht oder nicht. Diese Funktion kann man schreiben, und testen, und wenn sie funktioniert, dann in der Funktion zur Lösung des Problems verwenden.
Üpsilon
User
Beiträge: 222
Registriert: Samstag 15. September 2012, 19:23

Code: Alles auswählen

def wie_oft_drin(kleiner_string, grosser_string):
    return sum(kleiner_string == grosser_string[i:i+len(kleiner_string)] for i in range(len(grosser_string)-len(kleiner_string)+1))
    
print wie_oft_drin("is","missisippi")
print wie_oft_drin("fef","fefefefefefe")
print wie_oft_drin([7,4],[1,7,4,6,7,4,2,9,7,4])
Schönen Tag noch :mrgreen:
PS: Die angebotene Summe ist beachtlich.
mike7777
User
Beiträge: 3
Registriert: Montag 25. Januar 2016, 17:02
Kontaktdaten:

@BlackJack:
Hi. Und ja. Du hast mich erwischt. Ich mache so einen Online Pythonkurs. Aber macht Spaß.
Die count()-Methode kenne ich noch nicht, werde es aber mal damit versuchen.
btw: Danke für die Tipps.

@Üpsilon
Interessanter Code, aber der funzt nicht mit Python 3.5. Es gibt einen Syntaxerror. :K
Und irgendwie ist der Code zu "sexuell"! ;-)
BlackJack

@mike7777: ``print`` ist ab Python 3.0 eine Funktion und kein Schlüsselwort mehr.

Das mit dem Sex ist nur in Deinem Kopf. :P
Üpsilon
User
Beiträge: 222
Registriert: Samstag 15. September 2012, 19:23

Für Python3 muss man noch Klammern zum print setzen.

Wieso ist der Code denn "sexuell"? Wegen dem "drin" oder was? Eigentlich dachte ich, ich wär hier der einzige, der in der Pubertät ist. Anyway, "heißer" Tipp, man kann die Funktion auch umbenennnen.

@Bj: Uuuuuh gedisst! Du solltest Battle-Rapper werden.
PS: Die angebotene Summe ist beachtlich.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Falls auch überlappende Fundstellen möglich sein sollen:

Code: Alles auswählen

import itertools

def count(needle, haystack, start=None, stop=None):
    for occurrences in itertools.count():
        try:
            start = haystack.index(needle, start, stop) + 1
        except ValueError:
            return occurrences
mike7777
User
Beiträge: 3
Registriert: Montag 25. Januar 2016, 17:02
Kontaktdaten:

@BlackJack: Danke, jetzt klappts.

@Üpsilon: Danke nochmal für den Code. Jetzt klappts :-)
Kannste mir das mit dem "sum" nochmal näher erläutern?
Goethe:

"Jede Lösung eines Problems ist ein neues Problem."
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Nichts für ungut, aber der Vorschlag von Üpsilon ist IMHO viel komplexer als es mit den Sprachmitteln von Python sein müsste. Zudem werden da unnötige Substrings erzeugt und es werden potenziell mehr Iterationen durchlaufen als nötig, was sich ungünstig auf die Performance auswirkt.
Üpsilon
User
Beiträge: 222
Registriert: Samstag 15. September 2012, 19:23

@snafu Kann sein, dass du Recht hast, aber ich werds trotzdem mal erklären, schaden kann es ja nicht. Ich war einfach verlockt, das als Einzeiler zu schreiben. Deine Lösung finde ich btw sehr interessant, da ich noch nicht wusste, dass man .index mehr als den Suchwert mitgeben kann.

@mike Die eingebaute Funktion sum ist eigentlich dazu da, alle Zahlen aus einer Liste (oder Generator oder ähnliches) zusammenzuzählen. Aber True und False gelten in Python gewissermaßen auch als Zahlen, nämlich als 1 und 0. Wenn man sum also auf einen Liste von Booleans aufruft, zählt es also, wie oft True darin vorkommt. Ich erstell mir in einem Generator-Ausdruck (das ist sowas ähnliches wie eine List-Comprehension https://docs.python.org/2/tutorial/data ... rehensions) also einen Generator voller Booleans. Diese Werte geben für jede Stelle im grossen_string jeweils an, ob der kleine_string an dieser Stelle ist. Und dann werden mit sum halt die True's gezählt.
PS: Die angebotene Summe ist beachtlich.
Antworten