yameez
yameez

Reputation: 3

I am trying to append an arithmetic operation list into another empty list and returning the list

I want to append an arithmetic operation string into another list by splitting every numbers and operators. when i append 3.1 it becomes 3.0 then 1.0 instead.

I added float

def tokenization(expr):
    opr = ["+", "-", "*", "/", "^","(",")"]
    tokens = []
    for char in expr:       
        if char.isdigit():                  
            tokens.append(float(char)
        if char == '':
            continue
        if char in opr:
            tokens.append(char)
    return tokens

Upvotes: 0

Views: 84

Answers (1)

Olvin Roght
Olvin Roght

Reputation: 7812

Code:

def tokenization(expr):
    opr = ["+", "-", "*", "/", "^", "(", ")"]
    tokens = []
    digit_readed, dot_readed, zero_readed = 0, 0, 0
    for idx, char in enumerate(expr):
        if char == " ":
            digit_readed, dot_readed, zero_readed = 0, 0, 0
        elif char in opr:
            tokens.append(char)
            digit_readed, dot_readed, zero_readed = 0, 0, 0
        else:
            if char.isdigit():
                digit_readed += 1
                if char == "0":
                    zero_readed += 1
                    if dot_readed > 0:
                        continue
            elif char == "." and digit_readed > 0:
                dot_readed += 1
                zero_readed, digit_readed = 0, 0
                continue
            else:
                raise ValueError("Unexpected '{}' on {} symbol".format(char, idx + 1))

            if dot_readed == 1:
                tmp = (str(round(tokens[-1])) + "." if digit_readed == zero_readed + 1 else str(tokens[-1])) + \
                       "0" * zero_readed
                tokens[-1] = float(tmp + char)
                zero_readed = 0
            elif digit_readed == 1:
                tokens.append(float(char))
            elif digit_readed > 1:
                tokens[-1] = float(str(round(tokens[-1])) + char)

    return tokens

print(tokenization("(3.1 + 6*2^2) * (2 - 1)"))

Result:

['(', 3.1, '+', 6.0, '*', 2.0, '^', 2.0, ')', '*', '(', 2.0, '-', 1.0, ')']

Upvotes: 1

Related Questions