我的代数求解器在哪里出错了?

时间:2012-06-09 06:05:30

标签: python linear-algebra

示例等式:2x * 3x + 4x * 5x * 6x

for k in equ:
        if k == '*':
            if equ[equ.index(k)-1] == 'x':
                extraEqu1.append('1x')
                del(equ[equ.index(k)-1])
            else:
                x = equ[equ.index(k)-1]
                if 'x' in x:
                    extraEqu1.append(equ[equ.index(k)-1]) #extraEqu1.append(x)
                    del(equ[equ.index(k)-1])              #del(x)
            if equ[equ.index(k)+1] == 'x':
                extraEqu1.append('1x')
                del(equ[equ.index(k)+1])
            else:
                x = equ[equ.index(k)+1]
                if 'x' in x:
                    extraEqu1.append(equ[equ.index(k)+1]) #extraEqu1.append(x)
                    del(equ[equ.index(k)+1])              #del(x)
            del(equ[equ.index(k)])

检查是否有任何x变量相乘,将它们取出并将它们放在不同的列表中。我一直在玩上述代码的变体,它总是忽略最后一项或包含运算符。我毫不怀疑这段代码有很多错误,我没看到(但应该),请指出。任何帮助表示赞赏。

抱歉,我对输出不太清楚。我希望equ丢失任何x变量乘以(例如:2x * 3x都被移除),但留下任何未被乘的(例如:如果4x在其两侧都有+)。我想extraEqu1让所有x等变量都失去。

输入是示例等式或类似的

我使用了Jeff的注释并在其他两个语句中更改了extraEqu1.append和del()(但不是底部的del())来取x值而不是它的值,现在它完美无缺。有什么理由吗?注释代码显示我更改的内容

*注意:请不要说“使用SymPy”或其中任何一个,我正在构建我自己的版本作为项目

2 个答案:

答案 0 :(得分:1)

我不明白你的任务清楚,但如果你需要更好地反汇编数学表达式来使用正则表达式python re 这是查找所有x的

的示例
import re

txt='2x * 3x + 4x * 5x * 6x'

re1='(\\d+)'    # Integer Number 1
re2='(x)'   # Any Single Character 1

rg = re.compile(re1+re2,re.IGNORECASE|re.DOTALL)
m = rg.search(txt)
if m:
    int1=m.group(1)
    c1=m.group(2)
print "("+int1+")"+"("+c1+")"+"\n"

如果你没有使用正则表达式,你可以尝试像txt2re.com这样的regexps生成器

答案 1 :(得分:1)

问题是你在一个列表上循环并且你在循环中间改变了那个列表,所以循环最终会跳过一些元素,因为它们已经传递了一个位置。 看看这个例子:

>>> l = ['a','b','c','d']
>>> for e in l:
...    print e,
...    del(l[l.index(e)])
... 
a c

一种可能的解决方案是循环列表的副本:

for k in equ[:]:

另请注意,代码中的del(x)将不会执行任何操作,例如:

>>> l = ['a', 'b', 'c', 'd']
>>> a = l[0]
>>> del(a)
>>> l
['a', 'b', 'c', 'd']
>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
>>> 

del只删除一个变量,而不是该变量指向的对象(除非没有对该对象的其他引用,否则该对象也将被删除)

还要确保阅读Corey Ogburn评论中的内容。

编辑:编辑我之前的答案,因为我对代码有错误的解释。