Python:比较不同顺序的字符串

3
我正在使用Python 3做一个基于微积分和积分的数学测验,但是我很难检查用户输入的答案是否正确。目前我正在使用下面的代码来检查答案。然而,如果用户按照不同的顺序输入答案,则会被视为错误。例如,如果答案是x^5 + 6,但我输入了6 + x^5,尽管两个答案都是正确的,但它仍然被视为不正确。如何解决这个问题并保持答案处于字符串状态?
if self.Answer.text() == FDiffAnswer[1]:
    self.score = self.score + 1
else:
    self.score = self.score + 0

2
那么 x^(5)+6 怎么样? - Srinath
那么 x*x*x*x*x+6 或者 1*x^5+6 等等呢? - interjay
1
也许有更简单的方法,但如果我是你,我会倾向于用值替换变量,并将答案的值与正确答案进行比较。在数学中,你可以用很多不同的方式写出正确答案,但只有一个正确的值。 - HavelTheGreat
它们都将被视为不正确。 - mcseth antwi
2个回答

2
使用sympy可以按照以下方式完成...
x = symbols('x')
// user_input and original_eq are strings
expr1 = sympify(user_input) // user input
expr2 = sympify(original_eq) // Answer
print expr1==expr2

双等号(==)用于测试相等性。但是,它仅测试表达式的值是否相等,而不考虑符号意义。

http://docs.sympy.org/dev/gotchas.html#double-equals-signs

但是对于以下所有情况,这都返回True:
x**6 + 1 == x**(6) +  1
x**6 + 1 == 1 + x**6
x**3 + 1 == x*x*x +  1 

PS:Sympy(和Python)使用符号^表示异或运算。因此,如果您希望将其用作幂运算,需要在调用sympify之前将其替换为**。

如果方程式有系数但未乘以未知数,这是否有效?例如,5x ** 5 + 1 = 1 + 5*x ** 5。 - mcseth antwi
1
@mcsethantwi 不是这样的... 这就是 sympy 的问题所在... 你需要提供 sympy 能够理解的表达式... 但是还有一个小技巧,首先解析字符串,如果我们发现像 5x 这样的东西,就用 5*x 替换它,然后调用 sympify 函数。 - Srinath

1
你可以使用几个不同的变量对输入字符串进行eval()并检查输出是否正确:
user_str = 'x**5 + 6'

x = 4

print('Good Job') if eval(user_str) == 1030 else 'Wrong Answer'

然后您可以更改x的值几次,并继续使用预期输出进行检查,以验证用户的答案是否正确评估。
否则,您可以使用split()并检查输出的列表中的正确组件:
user_str = 'x^5+6'

l = user_str.split('+')

if 'x^5' in l and '6' in l and len(l) == 2:
    print('Good Job')
else:
    print('Wrong Answer')

当然,使用第二种方法,您需要编辑split()参数和if()语句的验证,但是您应该能够达到所需的检查。您还可以检查输出列表的len()以验证答案中是否有其他组件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接