2016-03-05 2 views
3

Я создаю программу, которая разделяет круглые скобки для «отдельных пар». Например, ()() превращается в |()|()|, но (()) остается неизменным, оставаясь |(())|. Он продолжает «получать» одного и того же персонажа. Я попытался изменить , где я вставляю, например pos - 1, но он все еще не работает. Вот мой код:For-loop возвращает тот же символ при разборе

def insert(source_str, insert_str, pos): 
     return source_str[:pos]+insert_str+source_str[pos:] 


x = 0 
rightSideOfEquation = "()bx((x))c(y(c+1)(x)y)" 


for pos in range(len(rightSideOfEquation)): 
    if x == 0: 
     rightSideOfEquation = insert(rightSideOfEquation,'|',pos) 
    if rightSideOfEquation[pos] == '(': 
     x += 1 
    if rightSideOfEquation[pos] == ')': 
     x -= 1 

print(rightSideOfEquation) 

Он печатает |||||||||||||||||||||||()bx((x))c(y(c+1)(x)y)
Я хочу, чтобы напечатать |()|bx|((x))|c|(y(c+1)(x)y)|

ПРИМЕЧАНИЕ: Вы можете увидеть здесь: ** https://math.stackexchange.com/questions/1682322/recursive-parsing-parenthesis-with-explanation
** Я попытался изменить его до pos + 1 и pos -1 с небольшим эффектом, кроме того, где он повторяется.

+1

если это рекурсивный синтаксический, где ваша рекурсия? – MSeifert

+2

x никогда не перестает быть 0 – JETM

+0

Ну, я не знаю, как это объяснить, плохо скажите, что вы можете читать больше здесь :) – XXXX

ответ

3

Использование «а» заявление вместо для петли составит вашу жизнь проще в этом случае:

def insert(source_str, insert_str, pos): 
    return source_str[:pos]+insert_str+source_str[pos:] 

x = 0 
rightSideOfEquation = "a()bx((x))c(y(c+1)(x)y)" 
pos = 0 

while pos < len(rightSideOfEquation): 
    if rightSideOfEquation[pos] == '(': 
     if x==0:   
      rightSideOfEquation = insert(rightSideOfEquation,'|',pos) 
      pos+=1 
     x += 1 
    elif rightSideOfEquation[pos] == ')': 
     x -= 1 
     if x == 0: 
      rightSideOfEquation = insert(rightSideOfEquation,'|',pos + 1) 
    pos+=1 

print(rightSideOfEquation) 

Это напечатает следующее:

a|()|bx|((x))|c|(y(c+1)(x)y)| 

Хотя это будет гораздо чище и проще, используя рекурсивную функцию, я хотел бы показать вам, как вы можете исправить ошибку в существующем коде, а не полностью изменить свой мыслительный процесс ...

+0

Рекурсивная функция объясняет, пожалуйста ... Хотелось бы, чтобы код был как можно чистым! – XXXX

+0

Выбранный вариант не связан с копиями объекта – XXXX

0

Вы не хотите менять то, что вы итерируете. Я установил свой код, создав копию входной строки, и это, кажется, работает:

def insert(source_str, insert_str, pos): 
    return source_str[:pos]+insert_str+source_str[pos:] 


x = 0 
rightSideOfEquation = "a()bx((x))c(y(c+1)(x)y)" 
copy = rightSideOfEquation 
posincopy = 0 

for pos in range(len(rightSideOfEquation)): 
    if rightSideOfEquation[pos] == '(': 
     x += 1 
     if x == 1: 
      copy = insert(copy,'|',posincopy) 
      posincopy = posincopy + 1 
    if rightSideOfEquation[pos] == ')': 
     x -= 1 
     if x == 0: 
      copy = insert(copy,'|',posincopy + 1) 
      posincopy = posincopy + 1 
    posincopy = posincopy + 1 

print(copy) 

выход:

a|()|bx|((x))|c|(y(c+1)(x)y)| 
+0

Ваш код не дает вывод, который вы здесь включили. Вывод из вашего кода:' | a |() | b | x | ((x)) | c | (y (c + 1) (x) y) '(обратите внимание на отсутствующий« | »в конце). Кроме того, вы печатаете дополнительные« | »в начале. – bbkglb

+0

У меня есть –

+0

Но теперь он печатает '| a |() | b | x | ((x)) | c | (y (c + 1) (x) y) |', который имеет несколько дополнительных «|», s, которого не должно быть ... – bbkglb

1

Изменение объекта пока вы итерируют через него всегда рецепт катастрофы.

Вам нужно создать новый объект, пока вы перебирать старую:

equation = "a()bx((x))c(y(c+1)(x)y)" 
new_equation = [] 
parens = 0 
for ch in equation: 
    if ch == '(': 
     if parens == 0: 
      new_equation.append('|') 
     new_equation.append(ch) 
     parens += 1 
    elif ch == ')': 
     new_equation.append(ch) 
     parens -= 1 
     if parens == 0: 
      new_equation.append('|') 
    else: 
     new_equation.append(ch) 
equation = ''.join(new_equation) 
print(equation) 

Что дает:

a|()|bx|((x))|c|(y(c+1)(x)y)| 
+0

Хотя это фиксировало «|», которые были напечатаны в начале, это все еще не правильно (обратите внимание на дополнительные «|» в начале и отсутствующие «|» после «bx» и первый «c»). – bbkglb

+0

@bbkglb: Да, это было трудно исправить из требований OP, но я подозреваю, что вы правы. О, исправил мой код, чтобы соответствовать этим результатам. –