2011-12-17 172 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,所有的表情真

+1

[評價在數學表達式可能重複Python](http://stackoverflow.com/questions/5049489/evaluating-mathematical-expressions-in-python) – outis 2011-12-17 19:35:15

+0

這是certanly **不是**鏈接的問題的重複。 – 2014-03-28 12:04:23

回答

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表達式。

但在你例子給了值,沒有什麼是匹配:(

+0

我知道eval,我會去使用that.There可能會超過2個表達式,所以你的方法不好,我認爲:(我粘貼了幾個值:) – matiit 2011-12-17 19:39:25

+2

這很容易概括爲兩個以上:'如果所有(eval(exp,value)爲exp中的d):' – 2011-12-17 19:46:56

0

我已經選擇了更安全的解決方案比使用eval

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] 
相關問題