2016-06-23 7 views
0

Ich muss jedes Zeichen durch das Zeichen nach dem Alphapet durch zwei ersetzen. Zum Beispiel g bis i und a bis c. Ich bekomme immer diese Fehlermeldung während ich das Programm machte es zu lösenTeilstring nicht gefunden Fehler

substring not found 

Hier ist mein Code:

string="g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj." 
#=========this is the string on the site 
alphapet="abcdefghijklmnopqrstuvwxyz" 
#this is the alphapet ofcourse 
x="" 
y=0 
z="" 
m=0 
#that was declaring variables 
#the following is a loop which would go through string 
for i in string: 
    #the if statement should check if i was in alphapet string 
    if i in alphapet: 
     if i=="y": 
      string.replace(i,"a") 
     elif i=="z": 
      string.replace(i,"b") 
     #the previous two conditions were special cases 
     else: 
      #the x will equal the first character as m =0 which is"g" 
      x=string[m] 
      #the y should equal the index of the character in alphapet this is were the error comes 
      y=alphapet.index(x) 
      #the z should equal the letter that comes after it by 2 in alphapet 
      z=alphapet[y+2] 
      #the following line should replace it 
      string.replace(i,z) 
      m+=1 
print(string) 
+0

In welcher Zeile heißt es, dass Ihr Fehler stammt? – nbryans

+1

Es sollte sein: y = alphapet.index (x) – Ohumeronen

+2

Nichts in dem Code, den Sie in Ihrer Frage einschließen, wird jemals 'substring not found' drucken. –

Antwort

1
s = "g fmnc wms bgblr rpylqjyrc gr zw fylb." 
alphapet = "abcdefghijklmnopqrstuvwxyz" 
alphapet += alphapet #This is a Trick. You can use it. 
new_string = "" 
for i in s:#once edited:"for i in string:" 
    if i not in alphapet: 
     new_string += i 
    else: 
     new_string += alphapet[alphapet.index(i)+2] 
print new_string 
+1

Sie müssen 'für i in string' in' für i in s' ändern oder 's' umbenennen. – roganjosh

+1

das war super klug mann danke –

+1

es kann auch gelöst werden, indem nur "ab" am ende –

1

Beim Laufen

x=string[m] 

x den Index gleich seine m in der string, einschließlich Interpunktion und Leerzeichen und so weiter.

Also, wenn

y=alphapet.index(x) 

Das Programm läuft, wird einen Fehler erhöhen, denn es gibt keine Satzzeichen oder Leerzeichen in alphapet ist.

Was Sie tun müssen, ist entweder ändern Sie den Code, um die Interpunktion zu behandeln, oder fügen Sie die Interpunktion der alphapet.

+0

hast du bemerkt, "wenn ich in Alphapet" über dem ersten Fall –

+0

@ Islamzidan, ich habe es noch nicht getestet, aber es kommt zu mir, dass "i" sich von "string [m]" unterscheidet, weil 'm' nur inkrementiert wird, wenn i in alphapet', während' i' mit geändert wird jede Iteration der 'for'-Schleife. – JAW

0

Das Problem ist, dass Sie m nur in das sonst statt jedes Mal erhöhen. Sobald i ein Zeichen ist, das nicht in alphapet steht, ist es nicht mehr dasselbe wie string [m]. Wenn Sie Ihre m+=1 desindent, wird es das Problem lösen, aber eigentlich brauchen Sie nicht m überhaupt, da Sie bereits i haben.

Es gibt andere Probleme in Ihrem Code: str.replace ändert keine Zeichenfolge an Ort und Stelle (Zeichenfolgen sind unveränderlich) aber geben Sie die geänderte Zeichenfolge zurück, und Sie ordnen dieses Ergebnis nicht zu, so dass es nutzlos ist.

Aber auch wenn replace() Ihre Zeichenfolge geändert hat, haben Sie immer noch ein Problem.

string = 'abcdef' 
string = string.replace('a', 'c') # 'cbcdef' 
string = string.replace('b', 'd') # 'cdcdef' 
string = string.replace('c', 'e') # 'ededef' <- not what you want 

Sie müssen also eine neue separate Zeichenfolge erstellen, während Sie iterieren, um zu tun, was Sie wollen.

Oder Sie können die str.maketrans() -Methode betrachten.

0

Siehe eine modifizierte Version unten, die funktioniert. String-Ersetzungen sollten speziell in der Zeichenfolge string = string.replace(...) gespeichert werden. Wie von anderen angegeben, wurde m nicht immer im Originalcode inkrementiert. Ich habe stattdessen enumerate verwendet, um sowohl Zeichenfolgen als auch Indizes zu erhalten.

string="g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj." 
#=========this is the string on the site 
alphapet="abcdefghijklmnopqrstuvwxyz" 
#this is the alphapet ofcourse 
x="" 
y=0 
z="" 
m=0 
#that was declaring variables 

#temporarily convert the special cases 
string = string.replace("y","Y") 
string = string.replace("z","Z") 

#the following is a loop which would go through string 
#enumerate gets each string character(i) as well as its index (j) 
for j,i in enumerate(string): 
    if i in alphapet: 
     x=string[j] 
     y=alphapet.index(x) 
     z=alphapet[y+2] 
     string = string[:j]+string[j].replace(i,z)+string[j+1:] 

#convert the special cases 
string = string.replace("Y","a") 
string = string.replace("Z","b")