首页 > 解决方案 > 将字典值与输入字符串条件列表进行比较

问题描述

我正在尝试编写一个接受条件字符串列表的 Python 脚本,将其与字典中的值进行比较,并在满足条件时执行(或抛出错误消息)。

下面给出了一个示例条件列表和字典值:

criteria_list = ['A < 5', 'B == 6', '3 < C < 4']
dict = {'A': 3, 'B': 6, 'C': 3.5, 'D': 5, 'E': 100}

我最初的想法是通过检查标准值是否在字典中来加载与标准相关的字典值。然后我可以检查该值是否满足条件,然后执行代码。如果条件值不在字典中,则抛出错误(即,criteria_list = [..., "Z == 10", ...] > 抛出 Z 不在字典中的错误)。

这就是我现在所拥有的,但是我无法找到一种方法来在本地保存键值以使用 eval(criteria) 来检查条件是 True 还是 False。

crit_sum = 0
     
for criteria in criteria_list:        
   for key in dict.keys():       
      if (key in criteria.split()):
                 
         #SAVE KEY VALUE (i.e. A = 3)
                 
         if eval(criteria):
            crit_sum += 1
        
         elif (key not in critera.split()):
            print("criteria not in dictionary!")
    
if crit_sum == len(criteria_list):  #execute code if all criteria are TRUE                
   #EXECUTE CODE

让我知道您认为在本地保存值的好方法或可用于评估任意大小的标准列表的另一种方法。

标签: pythondictionaryeval

解决方案


我假设您知道为什么使用eval(). 但是,如果您仍然希望这样做,您可以将一个空的 dict 传递给参数globals,并将您的 dict 传递给. 例如:localseval()

criteria_list = ['A < 5', 'B == 6', '3 < C < 4']
all_vars = {'A': 3, 'B': 6, 'C': 3.5, 'D': 5, 'E': 100}

crit_sum = 0
for crit in criteria_list:
    if eval(crit, {}, all_vars): 
        crit_sum += 1

if crit_sum == len(criteria_list):
    print("Success!")

或者,使用生成器表达式:

criteria_list = ['A < 5', 'B == 6', '3 < C < 4']
all_vars = {'A': 3, 'B': 6, 'C': 3.5, 'D': 5, 'E': 100}

if sum(eval(crit, {}, all_vars) for crit in criteria_list) == len(criteria_list):
    print("Success!")

all_vars当表达式使用(例如X == 100)中不存在的变量时,NameError: name 'X' is not defined如果您愿意,您会得到一个可以被捕获和处理的变量。


推荐阅读