2

示例方程: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 拥有 equ 会丢失的所有 x 变量。

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

我使用了 Jeff 的评论并更改了两个 else 语句中的 extraEqu1.append 和 del() (但不是底部的 del() )以采用 x 变量而不是它的值,现在它可以完美运行。有什么理由吗?注释代码显示了我所做的更改

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

4

2 回答 2

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 评论中的内容。

编辑:编辑了我之前的答案,因为我对代码有错误的假设。

于 2012-06-09T18:05:52.183 回答
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这样的正则表达式生成器

于 2012-06-09T06:31:01.933 回答