Wenn ich diese Zeichenfolge habe:
2+24*48/32
wie diese Liste am effizientesten zu erstellen ist:
['2', '+', '24', '*', '48', '/', '32']
Wenn ich diese Zeichenfolge habe:
2+24*48/32
wie diese Liste am effizientesten zu erstellen ist:
['2', '+', '24', '*', '48', '/', '32']
Eine andere Lösung wäre, einen solchen Rechner gar nicht erst zu schreiben. Einen RPN-Parser zu schreiben, ist viel einfacher und hat nichts von der Mehrdeutigkeit, die beim Schreiben von Mathematik mit Infix-Notation entsteht.
import operator, math
calc_operands = {
'+': (2, operator.add),
'-': (2, operator.sub),
'*': (2, operator.mul),
'/': (2, operator.truediv),
'//': (2, operator.div),
'%': (2, operator.mod),
'^': (2, operator.pow),
'**': (2, math.pow),
'abs': (1, operator.abs),
'ceil': (1, math.ceil),
'floor': (1, math.floor),
'round': (2, round),
'trunc': (1, int),
'log': (2, math.log),
'ln': (1, math.log),
'pi': (0, lambda: math.pi),
'e': (0, lambda: math.e),
}
def calculate(inp):
stack = []
for tok in inp.split():
if tok in self.calc_operands:
n_pops, func = self.calc_operands[tok]
args = [stack.pop() for x in xrange(n_pops)]
args.reverse()
stack.append(func(*args))
elif '.' in tok:
stack.append(float(tok))
else:
stack.append(int(tok))
if not stack:
raise ValueError('no items on the stack.')
return stack.pop()
if stack:
raise ValueError('%d item(s) left on the stack.' % len(stack))
calculate('24 38 * 32 / 2 +')
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
0 Stimmen
Sie wollen eine Zeichenkette in eine Liste aufteilen, aber Sie wollen nicht .split() verwenden, weil es eine Liste zurückgibt? Du widersprichst dir selbst. Wenn Sie keine Liste wollen, was wollen Sie dann tun wollen?
1 Stimmen
@Jim: Ich denke, Jibmo meint, dass split() nur die Angabe eines Trennzeichens erlaubt, so dass er es einmal für '+', einmal für '-', einmal für '/' usw. aufrufen müsste.
2 Stimmen
Sorry für die schlechte Erklärung, was ich meinte, ist, dass Split eine Liste zurückgibt, was bedeutet, für die zweite Split, ich muss jetzt über Zeichenfolgen innerhalb einer Liste zu iterieren. syntaktisch falsches Beispiel. string = "2+2-2" Liste = string.split(+) gibt ['2', '+', '2-2'] jetzt muss ich über 3 Zeichenfolgen iterieren
0 Stimmen
Sie sollten erwähnen, dass Sie an einem Programm arbeiten, das in der Lage sein muss, diese Zeichenketten als arithmetische Ausdrücke auszuwerten. Jerubs Antwort deckt das ab, aber das liegt daran, dass er ein Gedankenleser ist.
0 Stimmen
Warum verwenden Sie nicht einfach SymPy ? Es sollte das tun, was Sie zu erreichen versuchen.
0 Stimmen
Es ist nicht klar, ob Sie mit Fließkommazahlen/Dezimalzahlen oder ganzen Zahlen arbeiten. Ich meine, sollte das '.' (oder ',' für einige Länder) auch geteilt werden?