2011-12-17 5 views
3
d = ['X + Y = Z', 'X <=Y'] 
p = [{'Y': 1, 'X': 0, 'Z': 0}, {'Y': 1, 'X': 0, 'Z': 3}, {'Y': 1, 'X': 0, 'Z': 6}, {'Y': 1, 'X': 0, 'Z': 9}, {'Y': 1, 'X': 1, 'Z': 0}, {'Y': 1, 'X': 1, 'Z': 3}] 

変数が変更される式のリストを格納する構造を作成する必要があります。私が知っている必要があり文字列のリストに対してディクショナリのリストを処理できません

:整数に X、Y、Zの現在値が変更された文字と 表現

、それは問題がX何のために見ている値

の各辞書のためである必要があります、Y、Z、すべての式がTrueの

+1

[で数式を評価することができ、重複Python](http://stackoverflow.com/questions/5049489/evaluating-mathematical-expressions-in-python) – outis

+0

これはcertanlyです** **リンクされた質問の複製です。 –

答えて

3

式をよると(あなたがそれらを信頼することができます)あなたによって作られて、簡単な解決策は次のようにeval()を使用することです:

correct_values = [] 
for value in p: 
    #if eval(d[0], value) and eval(d[1], value): # basic version 
    if all(eval(exp, value) for exp in d):  # ehanced version thanks to @isbadawi 
     correct_values.append(value) 

あなたは式を修正する必要がありますX + Y = Zは有効なpythonではありません、X + Y == Zは有効なpython式です。

しかし、あなたが例に与えた値を使用して、何も私はevalを使用するよりも安全なソリューションを選択しましたでしょう:(

+0

私はevalを知っていると私はthat.Thereを使用すると、2つ以上の式がある可能性がありますので、あなたのアプローチは良いとは思いません:(そして、私はちょうどいくつかの値を貼り付けました:) – matiit

+2

2つ以上に一般化するのは簡単です: 'if exp(dのexp(exp、value) –

0

をマッチングされていない:

p = [{'Y': 1, 'X': 0, 'Z': 0}, {'Y': 1, 'X': 0, 'Z': 3}, 
    {'Y': 1, 'X': 0, 'Z': 6}, {'Y': 1, 'X': 0, 'Z': 9}, 
    {'Y': 1, 'X': 1, 'Z': 0}, {'Y': 1, 'X': 1, 'Z': 3}] 

f = lambda v: all([v['X'] + v['Y'] == v['Z'], 
        v['X'] <= v['Y'], 
        2*v['X'] + v['Y'] < v['Z']]) 

print [f(k) for k in p] 

# Output: [False, False, False, False, False, False] 
関連する問題