所以我必须创建一个程序,它采用以下形式的字符串:
2x^3 + x^2 - 4
并计算其衍生产品,即如下所示:6x^2 + 2x
所以我创建了一个class Monomial
,它有三个成员变量:系数,变量名和权力。换句话说,我必须将多项式分解为单项式。然后我必须采用每个单项式并将其分成前面提到的变量。因此,2x^3
将表示为以下对象:Monomial(2, 'x', 3)
但是,我如何拆分字符串呢?我不想使用'SymPy'或其他库来轻松计算衍生物。
答案 0 :(得分:5)
我会使用regular expressions:
pattern = "(\d+)?([a-z])\^(\d+)"
result = re.match(pattern, "323x^22")
print result.groups()
产生
('323', 'x', '22')
模式的解释如下:
每个括号都包含一个组,第一个匹配数字,由" \ d"表示。并匹配尽可能多的数字,由" +"表示。问号表示如果没有匹配(例如,因为它是x ^ 2),则表示正常。在中央组中,您会看到[a-z],它将匹配任何单个小写字母。所以,如果你发现" 23c ^ 2"它也会匹配。最后,你需要逃避" ^"符号,它在正则表达式中有其自己的含义,使用" \ ^"代替。
result = re.match(pattern, "x^2")
print result.groups()
现在,输入" x ^ 2"这段代码将产生:
(None, 'x', '2')
所以请确保用1代替None。
答案 1 :(得分:1)
首先我们需要将表达式拆分为简单的位,但是我们必须删除字符串中的空格。
simplerExpression = " "
expression = input("Expression to derive: ")
for x in range(len(expression)):
if expression[x] != " ":
simplerExpression = simplerExpression + expression[x]
知道你知道将每个单项式分开的所有内容都是+符号,所以我们将所有单项式分成一个数组:
ARRMonomial = []
for x in range(len(simplerExpression)):
if simplerExpression[x] != '+':
ARRMonomial.append(monomial)
monomial = 0
else:
monomial = monomial + simplerExpression[x]
你所做的是因为你确定在' x'之前的一切都是肯定的。将是一个循环遍历字符串中所有字符的系数,直到找到x然后将它们转换为int(如果你需要它)。还要注意我只对+符号做了这个而不是负号,这是因为我们需要在这个循环后面对数字进行否定:
ARRCoefficients = []
for monomial in ARRMonomial:
sign = 1
pos = 0
coefficient = ""
while monomial[pos] != 'x' and pos <= len(monomial)+1:
if monomial[pos] = '-':
sign = "-1"
else:
coefficient = coefficient + expression[pos]
pos = pos +1
#And if there is no coefficient then return 1
if coefficient == "":
coefficient = 1
ARRcoefficient.append(coefficient)
知道你有办法把系数拿出来。你所做的是搜索指数的值。你这样做是通过循环直到你找到一个x,然后在&#39; ^&#39;之后使用数字。
ARRExponents = []
for monomial in ARRMonomial:
Xexists = True
x = 0
while monomial[x] != 'x':
if x == len(monomial):
Xexists = False
break
x = x + 1
if monomial[x+1] == '^' and Xexists == True:
for y in range(x+1,len(monomial)):
exponent = exponent + monomial[y]
elif Xexists == True:
exponent = 1
else:
exponent = 0
ARRExponent.append(exponent)
你最终会得到一个系数列表和xs的指数(包括x到幂0),以便你把你的函数放在一边。如果您不知道该怎么做:
for x in range(len(ARRExponent)):
monome(ARRCoefficiant[x],'x',ARRExponent[x])
答案 2 :(得分:0)
我首先将初始字符串拆分为monomes并识别每个monome的元素:
现在使用re
模块处理字符串很简单:
def process(txt):
monomes = []
for elt in re.findall('([+-]?) *([\d]*)([a-zA-Z]?)(?:\^(\d+))?', txt):
coeff, var, exp = None, None, None
#print(elt)
if elt != ('','','',''):
if elt[1] == '':
coeff = 1
else:
coeff = int(elt[1])
if elt[0] == '-': coeff = - coeff
if elt[3] == '':
if elt[2] == '':
var = 'x'
exp = 0
else:
var = elt[2]
exp = 1
else:
exp = int(elt[3])
var = elt[2]
#print ((coeff, var, exp))
monomes.append(Monome(coeff, var, exp))
return monomes
我们现在得到:
>>> process(poly)
[Monome(2, 'x', 3), Monome(1, 'x', 2), Monome(-4, 'x', 0)]