2015-01-08 2 views
0

У меня есть программа Python для получения данных из файла JSON, а затем сохраните его в списке в порядке постфиксирования. Однако теперь я пытаюсь поместить данные в новый список, который находится в удобочитаемой математической нотации. Проблема в том, что я знаю, что мне нужно найти первого оператора, а затем найти предыдущие два числа - я могу сделать это для первого набора, однако рекурсия мимо этого пункта не работает, и я не могу понять, почему!Python Получить значения из списка в определенном порядке

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'] 

ответ

1

Вы можете рассмотреть вопрос о переходе на подходе к основе стека - раздвинуть операнды на стек операндов, как вы столкнулись их. Каждый раз, когда вы сталкиваетесь с оператором, вытащите соответствующее количество операндов из стека операндов (он всегда 2 в вашем примере, sine я вижу только двоичные операторы) - оцените выражение и верните результат обратно в стек операнда. Алгоритм разъяснено более подробно здесь:

http://en.wikipedia.org/wiki/Reverse_Polish_notation#Postfix_algorithm

Попытка сделать это с помощью позиционного индекса на основе подхода, можно получить довольно неудобно - так как у вас есть операторы, которые имеют различные уровни приоритета, ваша логика будет также должны обрабатывать как пропускать операнды, которые уже были «потреблены».

0

Вам необходимо использовать стек. Каждый числовой токен, с которым вы сталкиваетесь, попадает в стек. Когда вы сталкиваетесь с токеном оператора, вы выталкиваете два токена из стека и преобразуете их в выражение инфикса. Затем вы возвращаете полученное выражение обратно в стек.

например. на входе

1, 2, 3, +, +

Нажимаешь 1, 2 и 3, так что ваш стек становится

[1, 2, 3]

вы столкнулись с +, так что вы поп 2 и 3 и создать выражение инфиксной

[1, (2 + 3)]

вы сталкиваетесь +, так что вы совать два элемента и создать выражение инфиксной

[(1+ (2 + 3))]