我有一个图形界面,用户可以在其中输入数据过滤器作为字符串,如:
>= 10 <= 100
我喜欢从这个字符串创建一个if条件。
我目前的代码将字符串拆分为一个列表:
import re
def filter_data(string_filter)
# \s actually not necessary, just for optical reason
s_filter = r'(\s|>=|>|<=|<|=|OR|AND)'
splitted_filter = re.split(s_filter, string_filter)
splitted_filter = list(filter(lambda x: not (x.isspace()) and x, splitted_filter))
print(splitted_filter)
使用上面给定的过滤字符串,输出将是:
['>=', '10', '<=', '100']
我现在想用它来创建它的if条件。
我目前的想法是创建嵌套的if语句。
您是否看到了更好的解决方案?
谢谢!
答案 0 :(得分:2)
使用函数而不是控制流语法结构处理操作。
例如:
from operator import ge
binary_operations = {
">=": ge,
...
}
splitted_filter = ...
x = ...
result = True
while result and splitted_filter:
op = splitted_filter.pop(0)
func = binary_operations[op]
rhs = splitted_filter.pop(0)
result = func(x, rhs):
if result:
# do stuff
答案 1 :(得分:0)
我可能会创建一个运算符的dict来运行。例如:
operators = {
'>=': lambda a, b: a >= b,
'<=': lambda a, b: a <= b,
}
然后你可以开始一起编写这些功能。
首先,按成对迭代:
def pairs(l):
assert len(l) % 2 == 0
for i in range(0, len(l), 2):
yield (l[i], l[i + 1])
现在,将其应用于您的过滤器列表并构建一个函数列表:
filters_to_apply = []
for op, value in pairs(splitted_filter):
def filter(record):
return operators[op](record, value)
filters_to_apply.append(filter)
最后,将这些过滤器应用于您的数据:
if all(f(record) for f in filters_to_apply):
# Keep the current record
答案 2 :(得分:-1)
是的,您可以将条件与and
串联起来。
而不是
if x >= 10:
if x <= 100:
[do stuff]
您可以生成
if x >= 10 and x <= 100:
[do stuff]