2017-12-03 5 views
0

Zum Beispiel, ich brauche listBuilder('24+3-65*2') zurückzukehren ['24', '+', '3', '-', '65', '*', '2']String mit ganzen Zahlen zur Liste gruppiert

Wir sind nicht benutzerdefinierte importierte Funktionen zu nutzen. Ich muss diese Arbeit ohne sie machen. Dies ist, was ich bisher ...

def listBuilder(expr): 
    operators = ['+', '-', '*', '/', '^'] 
    result = [] 
    temp = [] 
    for i in range(len(expr)): 
     if expr[i] in operators: 
      result.append(expr[i]) 
     elif isNumber(expr[i]): #isNumber() returns true if the string can convert to float 
      temp += expr[i] 
      if expr[i+1] in operators: 
       tempTwo = ''.join(temp) 
       result.append(tempTwo) 
       temp = [] 
       tempTwo = [] 
      elif expr[i+1] == None: 
       break 
      else: 
       continue 

    return result 

An diesem Punkt bin ich immer einen Fehler, Stringindex für die Linie außerhalb des Bereichs einschließlich expr[i+1]. Hilfe wäre sehr willkommen. Ich bin seit Stunden darauf festgefahren.

+0

Vielleicht duplizierte Frage https://stackoverflow.com/questions/47616114/how-to-loop-over-the-elementary-arithmetic-symbols – dkato

+0

Wie werden Sie mit negativen Zahlen zu tun? – RoadRunner

Antwort

1

Sie durchlaufen alle Komponenten der Liste einschließlich des letzten Elements und testen dann, ob das nächste Element ein Operator ist. Dies bedeutet, dass wenn Ihre Schleife zum letzten Element gelangt, keine weiteren Elemente zum Testen und daher der Indexfehler vorhanden sind.

Beachten Sie, dass ein Operator niemals am Ende eines Ausdrucks auftreten würde. Das heißt, Sie würden so etwas wie 2+3- nicht bekommen, da das keinen Sinn ergibt. Als Ergebnis können Sie alle Artikel mit Ausnahme der letzten testen:

0

Ich bin mir nicht sicher, ob dies die beste Lösung ist, aber im gegebenen Fall funktioniert.

operators = ['+', '-', '*', '/', '^'] 
s = '24+3-65*2/25' 

result = [] 
temp = '' 

for c in s: 
    if c.isdigit(): 
     temp += c 
    else: 
     result.append(temp) 
     result.append(c) 
     temp = '' 
# append the last operand to the result list 
result.append(temp) 

print result 


# Output: ['24', '+', '3', '-', '65', '*', '2', '/', '25'] 
0

Ich kam mit einer prägnanten Version Ihrer Funktion auf der Zeichenfolge indicies vermeidet die Verwendung, die schneller in Python ist.

Ihr Code hat den Indexfehler verursacht, weil Sie in der letzten Iteration nach etwas an der Position i + 1 suchen, das sich am Ende der Liste befindet. Die Linie

if expression[i+1] in operators: 

führt den Fehler, da während der letzten Iteration ist i der letzte Listenindex und Sie für ein Listenelement überprüfen, die nicht existiert.

def list_builder(expression): 
    operators = ['+','-','*','/','^'] 
    temp_string = '' 
    results = [] 

    for item in expression: 
     if item in operators: 
      if temp_string: 
       results.append(temp_string) 
       temp_string = '' 
      results.append(item) 

     else: 
      if isNumber(item): 
       temp_string = ''.join([temp_string, item]) 

    results.append(temp_string) #Put the last token in results 

    return results