【问题标题】:Can't process list of dicts against list of strings无法根据字符串列表处理字典列表
【发布时间】:2011-12-17 19:18:15
【问题描述】:
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

【问题讨论】:

标签: python


【解决方案1】:

根据你的表达方式(所以你可以信任它们),一个简单的解决方案是像这样使用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 is not valid python, X + Y == Z is an valid python expression.

但是对于您在示例中给出的值,没有什么是匹配的:(

【讨论】:

  • 我知道 eval,我将使用它。可能有超过 2 个表达式,所以我认为你的方法不好:(而且我只粘贴了几个值 :)
  • 很容易概括为两个以上:if all(eval(exp, value) for exp in d):
【解决方案2】:

我会选择比使用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]

【讨论】:

    猜你喜欢
    • 2017-06-06
    • 1970-01-01
    • 2023-02-26
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    相关资源
    最近更新 更多