简体   繁体   English

Python eval表达式用于算术运算符的所有置换

[英]Python eval expression all permutations for arithmetic operators

Given string = '1*7/5-3' 给定string = '1*7/5-3'

I have expression to evaluate the string like eval('1*7/5-3') 我有表达式来评估像eval('1*7/5-3')这样的字符串

Code : 代码:

import __future__
string = '1*7/5-3'
print eval(compile(string, '<string>', 'eval', __future__.division.compiler_flag))

I want to evaluate for all permutations 我想评估所有排列

example 
        eval('((1*7)/5)-3') 
        eval('1*((7/5)-3)')
        and so on

I shouldn't have edited it to eliminate the "extraneous" parentheses. 我不应该对其进行编辑以消除“过分的”括号。 They were in fact, necessary. 实际上,它们是必要的。 I'm reverting to the original code. 我正在恢复原始代码。

The idea is to consider each operator symbol in turn as the main operation -- the root of the binary expression tree . 想法是依次将每个运算符视为主要操作- 二进制表达式树的根。 This splits the string into two parts, and we apply the procedure recursively. 这将字符串分成两部分,然后我们递归地应用该过程。

 def parenthesize(string):
    '''
    Return a list of all ways to completely parenthesize operator/operand string
    '''
    operators = ['+','-','*','/']
    depth = len([s for s in string if s in operators]) 
    if depth == 0:
        return [string]
    if depth== 1:
        return ['('+ string + ')']
    answer = []
    for index, symbol in enumerate(string):
        if symbol in operators:
            left = string[:index]
            right = string[(index+1):]
            strings = ['(' + lt + ')' + symbol +'(' + rt + ')' 
                           for lt in parenthesize(left) 
                           for rt in parenthesize(right) ]
            answer.extend(strings)
    return answer    

 string='4+7/5-3'
 for t in parenthesize(string):print(t, eval(t))

This prints 此打印

(4)+((7)/((5-3))) 7.5
(4)+(((7/5))-(3)) 2.4
((4+7))/((5-3)) 5.5
((4)+((7/5)))-(3) 2.4000000000000004
(((4+7))/(5))-(3) -0.7999999999999998

BTW is this for Euler Project problem 93? 顺便说一句,这是针对Euler Project问题93的吗?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM