示例等式: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”或其中任何一个,我正在构建我自己的版本作为项目
答案 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评论中的内容。
编辑:编辑我之前的答案,因为我对代码有错误的解释。