Ich habe:
eine Funktion: def find_str(s, char)
und eine Zeichenfolge: "Happy Birthday"
,
Ich möchte im Wesentlichen "py"
eingeben und 3
zurückgeben, bekomme aber stattdessen 2
zurück.
Code:
def find_str(s, char):
index = 0
if char in s:
char = char[0]
for ch in s:
if ch in s:
index += 1
if ch == char:
return index
else:
return -1
print(find_str("Happy birthday", "py"))
Nicht sicher, was falsch ist!
Idealerweise würden Sie str.find oder str.index verwenden, wie der demente Igel gesagt hat. Aber du hast gesagt, du kannst nicht ...
Ihr Problem besteht darin, dass Ihr Code nur nach dem ersten Zeichen Ihrer Suchzeichenfolge sucht, das (das erste) bei Index 2 ist.
Sie sagen im Grunde, wenn char[0]
in s
ist, erhöhen Sie index
, bis ch == char[0]
3 zurückgibt, als ich es getestet habe, aber es war immer noch falsch. Hier ist eine Möglichkeit, dies zu tun.
def find_str(s, char):
index = 0
if char in s:
c = char[0]
for ch in s:
if ch == c:
if s[index:index+len(char)] == char:
return index
index += 1
return -1
print(find_str("Happy birthday", "py"))
print(find_str("Happy birthday", "rth"))
print(find_str("Happy birthday", "rh"))
Es ergab folgende Ausgabe:
3
8
-1
Es gibt eine eingebaute Methode für String-Objekte, um dies in Python zu tun, wissen Sie?
s = "Happy Birthday"
s2 = "py"
print s.find(s2)
Python ist eine "Batterien eingeschlossene Sprache". Es gibt Code, der geschrieben wird, um das meiste zu tun, was Sie wollen (was auch immer Sie wollen).
Edit: find
gibt -1 zurück, wenn die Zeichenfolge nicht gefunden werden kann.
Hinzufügen zu @demented Hedgehog Antwort bei Verwendung von find()
In Bezug auf Effizienz
Es kann sinnvoll sein, zuerst zu überprüfen, ob s1 in s2 ist, bevor Sie find()
aufrufen.
Dies kann effizienter sein, wenn Sie wissen, dass s1 in den meisten Fällen keine Teilzeichenfolge von s2 ist
Da der Operator in
sehr effizient ist
s1 in s2
Die Konvertierung kann effizienter sein:
index = s2.find(s1)
zu
index = -1
if s1 in s2:
index = s2.find(s1)
Dies ist nützlich, wenn find()
häufig -1 zurückgibt.
Ich fand es wesentlich schneller, da find()
in meinem Algorithmus viele Male aufgerufen wurde, und dachte, es wäre erwähnenswert
spät auf die Party, suchte gleich, da "in" nicht gültig ist, hatte ich gerade folgendes angelegt.
def find_str(full, sub):
index = 0
sub_index = 0
position = -1
for ch_i,ch_f in enumerate(full) :
if ch_f.lower() != sub[sub_index].lower():
position = -1
sub_index = 0
if ch_f.lower() == sub[sub_index].lower():
if sub_index == 0 :
position = ch_i
if (len(sub) - 1) <= sub_index :
break
else:
sub_index += 1
return position
print(find_str("Happy birthday", "py"))
print(find_str("Happy birthday", "rth"))
print(find_str("Happy birthday", "rh"))
was produziert
3
8
-1
lower () für den Fall entfernen, dass ein unempfindlicher Fund nicht benötigt wird.
Ich beantwortete die Frage nicht direkt, bekam aber kürzlich eine ähnliche Frage, in der ich gefragt wurde, wie oft eine Unterzeichenfolge in einer bestimmten Zeichenfolge wiederholt wird. Hier ist die Funktion, die ich geschrieben habe:
def count_substring(string, sub_string):
cnt = 0
len_ss = len(sub_string)
for i in range(len(string) - len_ss + 1):
if string[i:i+len_ss] == sub_string:
cnt += 1
return cnt
Die find () - Funktion gibt wahrscheinlich nur den Index des ersten Vorkommens zurück. Wenn Sie den Index speichern, anstatt nur zu zählen, können wir den eindeutigen Satz von Indizes angeben, den die Unterzeichenfolge innerhalb der Zeichenfolge wiederholt.
Haftungsausschluss: Ich bin 'extrem' neu in der Python-Programmierung.