我有一个Python程序从JSON文件中获取数据,然后以修复后的顺序将其存储到列表中。但是现在,我试图将数据放入一个新的列表中,该列表是可读的数学符号。问题是,我知道我需要找到第一个运算符,然后找到前两个数字 - 我可以为第一个设置执行此操作,但是经过该点的递归不起作用,我无法找出原因!
testList = [None] * len(valueList)
global testListCounter
testListCounter = 0
def _solveProblem(i, testListCounter):
for i in range (len(typeList)):
if typeList[i] == "operation":
testList[testListCounter +1 ] = valueList[i]
_findLeftInteger(i)
i = i + 3
# _findRightInteger(i)
testListCounter = testListCounter + 3
return _solveProblem(i+1, testListCounter)
def _findLeftInteger(opPos):
for i in range(opPos, 0, -1):
if typeList[i-1] == ("constant") or typeList[i-1] == ("cell"):
testList[testListCounter] = valueList[opPos-1]
_findRightInteger(i-1)
def _findRightInteger(opPos):
for i in range(opPos, 0, -1):
if typeList[i-1] == ("constant") or typeList[i-1] == ("cell"):
testList[testListCounter+2] = valueList[opPos-1]
_solveProblem(0, testListCounter)
print (testList)
valueList包含:
['2', '90', '/', 'pi', '100', 13604.5, '20', '90', '/', '*', '+', '100', '+', '+
', '+']
typeList包含:
['constant', 'constant', 'operation', 'function', 'constant', 'cell', 'constant'
, 'constant', 'operation', 'operation', 'operation', 'constant', 'operation', 'o
peration', 'operation']
答案 0 :(得分:1)
您可能需要考虑转向基于堆栈的方法 - 在遇到操作数时将操作数推送到操作数堆栈。每次遇到一个运算符时,从操作数堆栈中弹出适当数量的操作数(在你的例子中它总是2,正弦我只看到二元运算符) - 计算表达式并将结果推回操作数堆栈。该算法在此处详细说明:
http://en.wikipedia.org/wiki/Reverse_Polish_notation#Postfix_algorithm
尝试使用基于位置索引的方法执行此操作可能会非常尴尬 - 因为您拥有具有不同优先级的运算符,您的逻辑还必须处理如何跳过已经“消耗”的操作数。
答案 1 :(得分:0)
您需要使用堆栈。您遇到的每个数字标记都会被压入堆栈。遇到运算符令牌时,从堆栈中弹出两个令牌并将其转换为中缀表达式。然后将结果表达式推回堆栈。
e.g。在输入
1,2,3,+,+
你按1,2和3,你的筹码就变成了
[1,2,3]
你遇到+,所以你弹出2和3并创建一个中缀表达式
[1,(2 + 3)]
您遇到+,因此弹出两个元素并创建中缀表达式
[(1 +(2 + 3))]