J'ai:
une fonction: def find_str(s, char)
et une chaîne: "Happy Birthday"
,
Je veux essentiellement saisir "py"
et renvoyer 3
mais je continue d’obtenir 2
pour le renvoyer.
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"))
Pas sûr de ce qui ne va pas!
Idéalement, vous utiliseriez str.find ou str.index comme un hérisson dément dit. Mais vous avez dit que vous ne pouvez pas ...
Votre problème est que votre code ne recherche que le premier caractère de votre chaîne de recherche qui (le premier) est à l'index 2.
Vous dites fondamentalement que si char[0]
est dans s
, incrémentez index
jusqu’à ch == char[0]
qui a renvoyé 3 lorsque je l’ai testé, mais c’était toujours faux. Voici un moyen de le faire.
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"))
Il a produit la sortie suivante:
3
8
-1
Il existe une méthode intégrée sur les objets chaîne pour faire cela en python, vous savez?
s = "Happy Birthday"
s2 = "py"
print s.find(s2)
Python est un "langage inclus avec les piles". Il y a du code écrit pour faire la plupart de ce que vous voulez déjà (ce que vous voulez) ... à moins que ce ne soit un devoir :)
Edit: find
renvoie -1 si la chaîne est introuvable.
tard à la fête, était à la recherche de même, comme "in" n'est pas valide, je venais de créer suite.
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"))
qui produit
3
8
-1
supprime lower () dans le cas où la recherche ne serait pas sensible à la casse.
Je n'ai pas répondu directement à la question, mais j'ai récemment reçu une question similaire dans laquelle on m'a demandé de compter le nombre de répétitions d'une sous-chaîne dans une chaîne donnée. Voici la fonction que j'ai écrite:
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
La fonction find () ne renvoie probablement que l'index de la première occurrence. Le fait de stocker l’index au lieu de compter, peut nous donner l’ensemble distinct d’index que la sous-chaîne est répété dans la chaîne.
Disclaimer: Je suis «extrêmement» novice en programmation Python.