将字典值与输入字符串条件列表进行比较

2024-09-15 17:47:32 发布

您现在位置:Python中文网/ 问答频道 /正文

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

下面给出了标准列表和字典值的示例:

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

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

这就是我现在所拥有的,但是我很难找到一种方法来本地保存键值,以使用eval(条件)来检查条件是否为真

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

让我知道您认为在本地保存值的好方法是什么,或者是评估任意大小的标准列表的另一种方法


Tags: 方法keyin列表标准if字典错误
2条回答

我假设你知道why not to use ^{}。但是,如果仍然希望这样做,可以将空dict传递给globals参数,并将dict传递给eval()locals参数。例如:

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,如果愿意,可以捕获并处理该变量

criteria_list = ['A < 5', 'B == 6', '3 < C < 4']
dic = {'A': 3, 'B': 6, 'C': 3.5, 'D': 5, 'E': 100}
crit_sum = 0
for k,v in dic.items():
    for i in criteria_list:
        if k in i:
            if eval(i.replace(k,str(v))):
                crit_sum+=1
        else:
            print("criteria not in dictionary!")
print(crit_sum)
if crit_sum == len(criteria_list):    #execute code if all criteria are TRUE 
    #EXECUTE CODE

相关问题 更多 >