Je crée un programme qui divisera les parenthèses pour des «paires séparées». Par exemple, ()() devient |()|()| mais (()) reste le même, étant |(())|. Il continue à «obtenir» le même personnage. J'ai essayé de changer où j'insère , comme pos - 1, mais cela ne fonctionne toujours pas. Voici mon code:

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)

Il imprime |||||||||||||||||||||||()bx((x))c(y(c+1)(x)y)
Je veux qu'il imprime |()|bx|((x))|c|(y(c+1)(x)y)|

REMARQUE: vous pouvez le voir ici: ** https://math.stackexchange.com/questions/1682322/recursive-parsing- parenthèse avec explication
** J'ai essayé de le changer en pos + 1 et pos -1 avec peu d'effet, sauf là où il se répète.

3
XXXX 5 mars 2016 à 03:47

3 réponses

Meilleure réponse

L'utilisation d'une instruction "while" au lieu d'une boucle for vous facilitera la vie dans ce cas:

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)

Cela imprimera ce qui suit:

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

Bien que cela soit beaucoup plus propre et plus facile en utilisant une fonction récursive, je voulais vous montrer comment vous pouvez corriger le bogue dans votre code existant au lieu de changer complètement votre processus de réflexion ...

3
bbkglb 5 mars 2016 à 01:13

Modifier un objet pendant que vous le parcourez est toujours une recette pour un désastre.

Vous devez créer un nouvel objet pendant que vous parcourez l'ancien:

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)

Qui donne:

a|()|bx|((x))|c|(y(c+1)(x)y)|
1
Ethan Furman 5 mars 2016 à 01:27

Vous ne voulez pas changer les choses que vous répétez. J'ai corrigé votre code en créant une copie de la chaîne d'entrée et il semble fonctionner:

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)

Production:

a|()|bx|((x))|c|(y(c+1)(x)y)|
0
Tony Babarino 5 mars 2016 à 01:25