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 変数が乗算されているかどうかを確認し、それらを取り出して別のリストに入れます。上記のコードのバリエーションをいじってみましたが、常に最後の項目を無視するか、演算子が含まれています。このコードには、私が見ていない (しかしすべきである) 多くの間違いがあることは間違いありません。指摘してください。どんな助けでも大歓迎です。

申し訳ありませんが、出力について明確ではありませんでした。乗算されている x 変数 (例: 2x * 3x の両方が削除された) を equ で失いますが、乗算されていないものは残します (例: 4x の両側に + がある場合)。私は、extraEqu1 に、equ が失うすべての x 変数を持たせたいと考えています。

入力は例の方程式、または類似のものです

Jeff のコメントを使用し、extraEqu1.append と del() の両方の else ステートメント (下部の del() ではない) を変更して、値の代わりに x 変数を取得したところ、完全に機能するようになりました。何か理由は?コメント付きのコードは、私が変更したものを示しています

*注: 「SymPy を使用する」などとは言わないでください。プロジェクトとして独自のバージョンを構築しています。

4

2 に答える 2

1

私はあなたのタスクを明確に理解していませんが、正規表現を使用するために数式を分解する必要がある場合 、これはすべての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 に答える
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 に答える