Python 我的代数解算器哪里出了问题?

Python 我的代数解算器哪里出了问题?,python,linear-algebra,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]

示例公式:
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两边都有a+)。我希望ExtraEq1拥有equ将丢失的所有x变量

输入是示例方程或类似的东西

我使用了Jeff的注释,并更改了两个else语句中的extraeq1.append和del()(但不是底部的del())以接受x变量,而不是它的值,现在它工作正常。有什么原因吗?注释代码显示了我所更改的内容


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

我不清楚您的任务,但是如果您需要反汇编数学表达式,最好使用regexps 这是查找所有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"

如果你不熟悉ReXEXP,你可以试试ReXEPS生成器,比如

问题是,你在列表中循环,并且在循环的中间改变这个列表,所以循环结束跳过一些元素,因为它们占据了已经通过的位置。 看看这个例子:

>>> 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
>>> 
l=['a',b',c',d'] >>>a=l[0] >>>德尔(a) >>>l ['a','b','c','d'] >>>a 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 NameError:未定义名称“a” >>>
del
只删除一个变量,而不是该变量指向的对象(除非没有对该对象的其他引用,否则该对象也将被删除)

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


编辑:编辑了我以前的答案,因为我对代码有错误的理解。

不是直接的解决方案,但一些可能会让您感兴趣的事情是和。我不了解您的算法。你想完成什么?你能举例说明你对输入和输出的期望(
eq
extraeq1
)吗?期望的输出是什么?您的输入得到了什么?首先,如果您使用enumerate而不是重复查找索引(您可以将enumerate与任何ITerableal一起使用),您可以使代码更加清晰。因此,您应该在空格上拆分字符串,这样就不必管有多少空格了(然后您可以只检查i-1中的“x”)