python - 将字典值与输入字符串条件列表进行比较
问题描述
我正在尝试编写一个接受条件字符串列表的 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
让我知道您认为在本地保存值的好方法或可用于评估任意大小的标准列表的另一种方法。
解决方案
我假设您知道为什么不使用eval()
. 但是,如果您仍然希望这样做,您可以将一个空的 dict 传递给参数globals
,并将您的 dict 传递给. 例如:locals
eval()
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
如果您愿意,您会得到一个可以被捕获和处理的变量。
推荐阅读
- html - 使用 span 用圆圈包围数字
- reactjs - 我如何在反应中循环这个
- python - 不确定这个递归是如何工作的
- python - 切片的numpy数组不会修改原始数组
- java - java更新对象并将其存储在数组列表中
- excel - 如何计算excel中填充的连续字段数?
- angular - StaticInjectorError AppModule UsersListComponent -> UsersListService 角度 5
- docker - Docker 多阶段构建与不同的项目
- python - 根据另一个数据框中的信息编辑数据框中的值
- php - PHP Mail 提交表单而不刷新