无法处理字符串列表中的字典列表

时间:2011-12-17 19:18:15

标签: python

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}]

我需要创建一些可以存储表达式List的结构,其中变量被更改。

我需要知道: X,Y,Z当前值 更改字母到整数的表达式

并且它必须是每个值的字典

问题是看看X,Y,Z,所有表达式都是真的

2 个答案:

答案 0 :(得分: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表达式。

但是使用您在示例中给出的值,没有任何匹配:(

答案 1 :(得分: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]