使用 re.compile 计算微分多项式的系数并在 python 中搜索
Calculating the coefficients of a differentiated polynomial using re.compile and searching in python
测试多项式 '2x^3+4x^2+8x-16' 我下面的代码输出 [6, 8]作为微分多项式的系数。但是,输出应该是 [6, 8, 8]。 为什么函数 getNewCoefficients 产生了错误的结果?产生正确结果的好方法是什么?
def getNumbers(polynomial):
regex = re.compile(r"[+-]?\d+(?:\.\d+)?")
return regex.findall(polynomial)
def formatNumbers(numbers):
formattedNumbers = []
for e in numbers:
if (e[0] == '+'):
formattedNumbers.append(e[1:])
else:
formattedNumbers.append(e)
return formattedNumbers
def getNumberPositions(polynomial, numbers):
numberPositions = []
for e in numbers:
tmp = [m.start() for m in re.finditer(e, polynomial)]
for f in tmp:
if f not in numberPositions:
numberPositions.append(f)
return sorted(numberPositions)
def getNewCoefficients(polynomial, numberPositions, numbers):
tmp = '0'
newCoefficients = []
for i in range(0,len(numberPositions)):
if numberPositions[i] + 1 < len(polynomial):
if polynomial[numberPositions[i] + 1] == '+' or polynomial[numberPositions[i] + 1] == '-':
newCoefficients.append(int(numbers[i])*int(tmp))
elif numberPositions[i] - 1 > 0:
if polynomial[numberPositions[i] - 1] == '+' or polynomial[numberPositions[i] - 1] == '-':
newCoefficients.append(int(numbers[i]))
tmp = numbers[i]
return newCoefficients
你不需要re
模块,你可以使用sympy
模块,但你必须先从http://www.sympy.org/en/index.html. I'm not a sympy
expert, but I found a similar Stack Overflow question下载它,这可能对你有帮助。
而且,让你知道,指数不算作系数...
这个问题可以使用负向回顾断言更容易地解决。
COEFFICIENT_PATTERN = re.compile(r"(?<!x\^)(?<!x\^-)-?\d+")
coefficients = [int(c) for c in COEFFICIENT_PATTERN.findall(polynomial)]
此解决方案对 x^
和 x^-
使用了两个负后视(因为后视必须是固定长度)。所以它写着“给我所有不以 x^
.
开头的整数
>>> COEFFICIENT_PATTERN.findall('2x^3+4x^2+8x-16')
['2', '4', '8', '-16']
测试多项式 '2x^3+4x^2+8x-16' 我下面的代码输出 [6, 8]作为微分多项式的系数。但是,输出应该是 [6, 8, 8]。 为什么函数 getNewCoefficients 产生了错误的结果?产生正确结果的好方法是什么?
def getNumbers(polynomial):
regex = re.compile(r"[+-]?\d+(?:\.\d+)?")
return regex.findall(polynomial)
def formatNumbers(numbers):
formattedNumbers = []
for e in numbers:
if (e[0] == '+'):
formattedNumbers.append(e[1:])
else:
formattedNumbers.append(e)
return formattedNumbers
def getNumberPositions(polynomial, numbers):
numberPositions = []
for e in numbers:
tmp = [m.start() for m in re.finditer(e, polynomial)]
for f in tmp:
if f not in numberPositions:
numberPositions.append(f)
return sorted(numberPositions)
def getNewCoefficients(polynomial, numberPositions, numbers):
tmp = '0'
newCoefficients = []
for i in range(0,len(numberPositions)):
if numberPositions[i] + 1 < len(polynomial):
if polynomial[numberPositions[i] + 1] == '+' or polynomial[numberPositions[i] + 1] == '-':
newCoefficients.append(int(numbers[i])*int(tmp))
elif numberPositions[i] - 1 > 0:
if polynomial[numberPositions[i] - 1] == '+' or polynomial[numberPositions[i] - 1] == '-':
newCoefficients.append(int(numbers[i]))
tmp = numbers[i]
return newCoefficients
你不需要re
模块,你可以使用sympy
模块,但你必须先从http://www.sympy.org/en/index.html. I'm not a sympy
expert, but I found a similar Stack Overflow question下载它,这可能对你有帮助。
而且,让你知道,指数不算作系数...
这个问题可以使用负向回顾断言更容易地解决。
COEFFICIENT_PATTERN = re.compile(r"(?<!x\^)(?<!x\^-)-?\d+")
coefficients = [int(c) for c in COEFFICIENT_PATTERN.findall(polynomial)]
此解决方案对 x^
和 x^-
使用了两个负后视(因为后视必须是固定长度)。所以它写着“给我所有不以 x^
.
>>> COEFFICIENT_PATTERN.findall('2x^3+4x^2+8x-16')
['2', '4', '8', '-16']