Python eval 表达式算术运算符的所有排列
Python eval expression all permutations for arithmetic operators
鉴于string = '1*7/5-3'
我有表达式来评估像 eval('1*7/5-3')
这样的字符串
代码:
import __future__
string = '1*7/5-3'
print eval(compile(string, '<string>', 'eval', __future__.division.compiler_flag))
我想评估所有排列
example
eval('((1*7)/5)-3')
eval('1*((7/5)-3)')
and so on
我不应该编辑它来消除 "extraneous" 括号。事实上,它们是必要的。我要恢复到原始代码。
想法是依次将每个运算符符号视为主要操作——binary expression tree 的根。这将字符串分成两部分,我们递归地应用该过程。
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))
这会打印
(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
顺便说一句,这是欧拉项目第 93 题吗?
鉴于string = '1*7/5-3'
我有表达式来评估像 eval('1*7/5-3')
代码:
import __future__
string = '1*7/5-3'
print eval(compile(string, '<string>', 'eval', __future__.division.compiler_flag))
我想评估所有排列
example
eval('((1*7)/5)-3')
eval('1*((7/5)-3)')
and so on
我不应该编辑它来消除 "extraneous" 括号。事实上,它们是必要的。我要恢复到原始代码。
想法是依次将每个运算符符号视为主要操作——binary expression tree 的根。这将字符串分成两部分,我们递归地应用该过程。
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))
这会打印
(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
顺便说一句,这是欧拉项目第 93 题吗?