it-swarm.com.de

Python: Finden Sie einen Teilstring in einem String und geben Sie den Index des Teilstrings zurück

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!

45
Tyler

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
9
Eric Fortin

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.

163

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

1
Jerry

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.

1
Parth

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.

0
Anshul