Python以特定顺序从List中检索值

时间:2015-01-08 15:40:32

标签: python json recursion postfix-notation

我有一个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']

2 个答案:

答案 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))]