如何优雅校验字典键值对是否满足用户自定义搜索条件?
优雅实现字典条件校验方案
需求场景
有一个结构如下的字典:
dictionary = {'a':25, 'ab':3.3, '(cd)': 4, 'ef':35, 'gh':12.2, ...}
用户会输入一串用逗号分隔的搜索条件,比如:
'a > 5, 0 < (cd) < 6, ef < 35'
需要判断这个字典是否满足所有条件,满足就执行对应逻辑,不满足则执行其他操作。
之前用split(',')拆分条件后逐个解析键、运算符和数值的方式太繁琐,这里给你两种更简洁的实现思路:
思路一:用eval()动态求值
⚠️ 注意:这种方式只适用于完全可信的条件输入,避免恶意代码注入风险。
核心思路是把条件里的键替换成字典对应的数值,再用eval()直接计算条件的布尔结果,最后判断所有条件是否都成立。
示例代码:
dictionary = {'a':25, 'ab':3.3, '(cd)': 4, 'ef':35, 'gh':12.2} condition_str = 'a > 5, 0 < (cd) < 6, ef < 35' # 拆分条件并去除空格 conditions = [cond.strip() for cond in condition_str.split(',')] # 把条件中的键替换成字典里的对应值 def replace_keys(cond, d): for key in d: cond = cond.replace(key, str(d[key])) return cond # 检查所有条件是否都满足 all_met = all(eval(replace_keys(cond, dictionary)) for cond in conditions) if all_met: print("满足所有条件") else: print("不满足所有条件")
运行后会输出不满足所有条件,因为ef=35不符合ef < 35的要求。
思路二:用Pandas DataFrame校验
如果项目里已经在用Pandas,这种方式会更顺手。把字典转成单行DataFrame,用query()方法直接执行条件判断。
示例代码:
import pandas as pd dictionary = {'a':25, 'ab':3.3, '(cd)': 4, 'ef':35, 'gh':12.2} condition_str = 'a > 5, 0 < (cd) < 6, ef < 35' # 把逗号分隔的条件替换成Pandas query支持的and query_condition = condition_str.replace(',', ' and ') # 转成单行DataFrame df = pd.DataFrame([dictionary]) # 判断是否满足所有条件:筛选后不为空则满足 all_met = not df.query(query_condition).empty if all_met: print("满足所有条件") else: print("不满足所有条件")
内容的提问来源于stack exchange,提问作者Murchak
相关产品推荐
相关产品推荐

