Массив сам очищает предыдущие значения, после чего заполняет их значением текущей итерации
import re
import os
def Factorial(n):
factorial = 1
if n == 0:
factorial = 1
else:
for i in range(n):
factorial *= n+1
return factorial
mathSign = ["+", "-", "*", "/", "!", "^", "%", "(", ")"]
mathSignOperation = {
"+": lambda x, y: x + y,
"-": lambda x, y: x - y,
"*": lambda x, y: x * y,
"/": lambda x, y: x / y
}
while True:
index = []
numberList = []
mathSignList = []
number = ""
mathSignAdd = []
numberAdd = []
maxBrackets = 0
bracketsCount = 0
bracketsList = []
bracketsmathSignList = []
bracketsListPoint = {}
while True:
check = ""
mathFunction = input("\nЧтобы завершить программу введите End.\nВведите пример: ").replace(" ","")
if mathFunction.lower() == "end":
os.abort()
check = re.search(r'[a-zA-Zа-яА-ЯёЁ@"#$&?><|]', mathFunction)
if check != None:
print("Пример введен не корректно\n")
else:
break
for i in range(len(mathFunction)):
if mathFunction[i] in mathSign:
if mathFunction[i] != "(":
if number != "":
numberList.append(number)
number = ""
mathSignList.append(mathFunction[i])
if mathFunction[i] == "(":
numberList.append("brackets"+str(bracketsCount))
mathSignList.append(mathFunction[i])
bracketsListPoint["brackets"+str(bracketsCount)] = [len(mathSignList)-1, None]
bracketsCount += 1
maxBrackets = bracketsCount
if mathFunction[i] == ")":
while bracketsCount >= 0:
bracketsCount -= 1
if bracketsCount < 0:
print("Присутствуют лишнии знаки закрытой скобки")
os.abort()
if bracketsListPoint["brackets"+str(bracketsCount)][1] == None:
numberList.append("brackets-"+str(bracketsCount))
bracketsListPoint["brackets"+str(bracketsCount)][1] = len(mathSignList)-1
break
bracketsCount = maxBrackets
else:
number += mathFunction[i]
if number != "":
numberList.append(number)
for i in range(maxBrackets-1, -1, -1):
numberAdd.clear()
mathSignAdd.clear()
j = numberList.index("brackets"+str(i)) + 1
while "brackets-"+str(i) in numberList:
numberAdd.append(numberList.pop(j))
j = bracketsListPoint["brackets"+str(i)][0]
while mathSignList[j] != ")":
mathSignAdd.append(mathSignList.pop(j))
mathSignAdd.pop(0)
mathSignList.pop(j)
numberAdd.pop()
bracketsList.append(numberAdd)
bracketsmathSignList.append(mathSignAdd)
bracketsList.reverse()
bracketsmathSignList.reverse()
bracketsList.append(numberList)
bracketsmathSignList.append(mathSignList)
print(numberList)
print(mathSignList)
print(bracketsList)
print(bracketsmathSignList)
print(bracketsListPoint)
Данный код принимает в себя уравнение, например 2*(5+7). Возникла проблема массивы bracketsList
и bracketsmathSignList
должны разделять уравнение по частям, относительно найденных скобок.
Но при каждой новой итерации цикла for i in range(maxBrackets-1, -1, -1):
, все предыдущие значения списка очищаются, а потом заполняются значением текущей итерации.
Источник: Stack Overflow на русском