36 Stimmen

Wie kann ich eine Zeichenkette in eine Liste aufteilen?

Wenn ich diese Zeichenfolge habe:

2+24*48/32

wie diese Liste am effizientesten zu erstellen ist:

['2', '+', '24', '*', '48', '/', '32']

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

5voto

Jiayao Yu Punkte 808

s = "2+24*48/32"

p = re.compile(r'( \W +)')

p.split(s)

4voto

Cristian Punkte 40446

Reguläre Ausdrücke:

>>> import re
>>> splitter = re.compile(r'([+*/])')
>>> splitter.split("2+24*48/32")

Sie können den regulären Ausdruck um beliebige andere Zeichen erweitern, die Sie aufteilen möchten.

4voto

habnabit Punkte 9240

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 +')

5 Stimmen

Warum gehst du nicht einfach hin und führst es aus, es sind nur noch 5 Zeilen!

1voto

jbchichoko Punkte 1534
>>> import re
>>> my_string = "2+24*48/32"
>>> my_list = re.findall(r"-?\d+|\S", my_string)
>>> print my_list

['2', '+', '24', '*', '48', '/', '32']

Das wird den Zweck erfüllen. Ich habe diese Art von Problem schon einmal erlebt.

0voto

Ich bin sicher, Tim meinte

splitter = re.compile(r'([\D])'). 

Wenn Sie genau kopieren, was er aufgeschrieben hat, erhalten Sie nur die digits nicht die operators .

CodeJaeger.com

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.

Powered by:

X