2017-06-15 4 views
0

Ich habe an diesem Problem seit Stunden gearbeitet und ich kann es einfach nicht scheinen. Meine Logik ist so weg mit diesemPython String Slicing Beispiel Set

Ziel ist es, die Höhe der Zeit das Wort „bob“, die 2 ist = basierend auf der erwarteten Ausgabe erfolgt, um zu bestimmen das Problem ist zu fragen.

Ich weiß nur nicht, wie man dorthin kommt. Ich habe so weit wie:

Wenn jemand dies beantwortet, bitte erklären Sie mir, wie Sie die Antwort bekommen haben. Vielen Dank im Voraus

+2

Sie müssen 's vergleichen [i: i + 3]' auf ' "bob"' und wenn gleich Zuwachs Ihrer 'bob' Zahl. – AChampion

Antwort

0

Bitte überprüfen Sie den Code.

s = 'azcbobobegghakl' 
bob = 0 
for i in range(len(s)): 
    print(s[i: i+3]) 
    if s[i: i+3] == "bob": 
     bob += 1 
print("Number of times bob occurs is: ", bob) 

Der Ausgang ist,

azc 
zcb 
cbo 
bob 
obo 
bob 
obe 
beg 
egg 
ggh 
gha 
hak 
akl 
kl 
l 
Number of times bob occurs is: 2 
0

Der folgende Ausschnitt verwendet regex Bibliothek re nicht überlappende Teil zu finden und alle Instanzen als eine Liste gefunden zurück. len() der Liste ist die Anzahl der Vorkommen.

import re 
number_of_bob = len(re.findall("bob", "azcbobobegghakl")) 

Dieser Ansatz funktioniert nicht für überlappende Muster. Um die Anzahl der überlappenden Teilstrings in einer Zeile zu finden:

number_of_bob = sum(1 for i in range(len(s)-2) if s[i:i+3] == 'bob') 
+0

Eigentlich findall findet nur * nicht überlappende * Spiele - damit Ihr Code 1 zurück, nicht 2. –

+0

Während dieses Code die Frage beantworten kann, zusätzlichen Kontext in Bezug auf, warum und/oder wie dieser Code die Frage beantwortet seine langfristigen verbessert Wert. –

+0

@ Donald Duck Antwort korrigiert, Danke. – Muposat

0

Ihre Antwort ist eigentlich ganz einfach. Sie haben die Hälfte des Problems gelöst. Sie durchlaufen Ihre Zeichenfolge zu dritt. Was Sie wissen müssen, ist der Test, ob einer dieser Teilzeichenfolgen der Zeichenfolge "bob" entspricht. Wenn ja, erhöht die bob Zähler von 1:

>>> s = 'azcbobobegghakl' 
>>> bob = 0 
>>> 
>>> for i in range(len(s)): 
    substr = s[i: i + 3] 
    # is the current three letter substring equal to "bob"? 
    if substr == 'bob': 
     # if so, increment the counter by one. 
     bob += 1 


>>> bob 
2 
>>> 
0

Hier ist ein 1-Liner mit Liste Verständnis.

s = 'azcbobobegghakl' 
count = [s[i : i + 3] for i in range(len(s))].count('bob') 

print("Number of times bob occurs is: ", count) 

Drucke

Number of times bob occurs is: 2 
+0

Join wird absolut nicht benötigt: '[s [i: i + 3] für i im Bereich (len (s) -2)]. Count ('bob')' – Muposat

+0

@Muposat Du hast absolut recht. Ich habe vergessen, dass es sich um eine Zeichenfolge und nicht um eine Liste handelt. Vielen Dank. –