Seite 1 von 1
Substrings zählen
Verfasst: Montag 25. Januar 2016, 17:09
von mike7777
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
Re: Substrings zählen
Verfasst: Montag 25. Januar 2016, 17:23
von 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.
Re: Substrings zählen
Verfasst: Montag 25. Januar 2016, 18:08
von Üpsilon
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

Re: Substrings zählen
Verfasst: Montag 25. Januar 2016, 21:13
von mike7777
@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"!

Re: Substrings zählen
Verfasst: Montag 25. Januar 2016, 22:03
von BlackJack
@mike7777: ``print`` ist ab Python 3.0 eine Funktion und kein Schlüsselwort mehr.
Das mit dem Sex ist nur in Deinem Kopf.

Re: Substrings zählen
Verfasst: Montag 25. Januar 2016, 22:32
von Üpsilon
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.
Re: Substrings zählen
Verfasst: Dienstag 26. Januar 2016, 00:29
von snafu
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
Re: Substrings zählen
Verfasst: Dienstag 26. Januar 2016, 09:50
von mike7777
@BlackJack: Danke, jetzt klappts.
@Üpsilon: Danke nochmal für den Code. Jetzt klappts

Kannste mir das mit dem "sum" nochmal näher erläutern?
Re: Substrings zählen
Verfasst: Dienstag 26. Januar 2016, 11:22
von snafu
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.
Re: Substrings zählen
Verfasst: Donnerstag 28. Januar 2016, 16:47
von Üpsilon
@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.