从string创建if条件

时间:2018-03-14 12:59:10

标签: python python-3.x if-statement

我有一个图形界面,用户可以在其中输入数据过滤器作为字符串,如:

>= 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语句。

您是否看到了更好的解决方案?

谢谢!

3 个答案:

答案 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]