2011-12-17 173 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] 
相关问题