0

さまざまな文字列を数値に関連付けるマッピング、マップがあるとします。

{['a', 1],['b', 2], ['c',5]}

op算術演算に分散する演算を定義したいと思います。だから私は op を次のように機能させたい:

op('a+b') = 3

op('b') = 2

op('a*b+c') = 7 

私が考えられる唯一の方法は、文字列を解析し、操作を記憶し、マッピングを行い、操作を行うことです。コストがかかる/時間がかかるように思えますが、組み込みの操作を備えたよりエレガントなソリューションがあることを願っています。

編集:

私がこれを表現した方法は、私の質問に対して静かで正確ではなかったことを認識しています。システムでマッピングが定義されていないため、可能なすべてのマッピングを定義することはできません。マッピングについて外部ソースに問い合わせる必要があります。

4

4 に答える 4

1

'あなたが念頭に置いているかどうかはわかりませんが、Python では演算子をオーバーライドできます。文字列の解析が望ましくない場合は、ラッパー クラスを作成し、関連する演算子を定義して「マッピング」から値を抽出することができます。ここでは、辞書を使用し、「追加」のみを定義します。

class V:
    values = { 'a': 1, 'b': 2, 'c': 3 }

    def __init__(self, name):
        self.name = name

    def __add__(self, other):
        return V.values[self.name] + V.values[other.name]

a = V('a')
b = V('b')

print a+b
# display 3

文字列を扱う場合は、次evalのような式を使用することもできます (セキュリティの観点からevalが親友でなくても、信頼できないソースからの式を直接評価するべきではありません)。

print eval("a+b")
# display 3
于 2013-06-21T17:45:43.547 に答える
0

sympy を再発明したい場合 (コメントを参照) を除いて、文字列内のデータを解析し、抽象構文ツリーを作成し、シンボルを取得して、それを python オブジェクトに変換する必要があります。そうすれば、オペレーターの優先順位を尊重することもでき、EVAL を使用していません

あなたへの私の最善のアドバイスは、単純な計算機を実装する方法を示すこの70 行の要点(どういうわけかあなたが望むもの) を見ることです。値を文字列内の値と一致させるだけです。

私が話しているのと同じ精神で、@JFSebastian はさらに優れた投稿をリンクしました。

于 2013-06-21T17:47:08.247 に答える