以编程方式选择不等式运算符

时间:2021-02-09 18:59:43

标签: python pandas dataframe

我正在尝试根据来自配置文件的输入执行操作。在配置中,会有信号、比较和值的规范。我想将该比较字符串转换为不等式运算符的选择。现在,这看起来像

def compute_mask(self, signal, comparator, value, df):
    if comparator == '<':
        mask = df[signal] < value
    elif comparator == '<=':
        mask = df[signal] <= value
    elif comparator == '=':
        mask = df[signal] == value
    elif comparator == '>=':
        mask = df[signal] >= value
    elif comparator == '>':
        mask = df[signal] > value
    elif comparator == '!=':
        mask = df[signal] != value
    
    return mask

在其他应用程序中,我能够做类似的事情

func = {
    'a': func_a,
    'b': func_b,
    'c': func_c
}.get(func_choice)
func(value_to_process)

为了轻松避免不得不一遍又一遍地重复代码。我将如何在这里做同样的事情?

2 个答案:

答案 0 :(得分:3)

您可以使用 operator 模块获取与每个运算符等效的函数。

import operator

funcs = {
    '<': operator.lt,
    '<=': operator.le,
    '=': operator.eq,
    '>': operator.gt,
    '>=': operator.ge,
    '!=': operator.ne
}

def compute_mask(self, signal, comparator, value, df):
    return funcs[comparator](df[signal], value)

答案 1 :(得分:1)

我最近看到了一个像这样的巧妙解决方案,您将案例列为 dict 中的 lamdba,然后从 dict 中获取 lamdba 并在 return 语句中调用它。在你的情况下,它会是这样的:

def compute_mask(signal, comparator, value, df):
    cases = {
        '<': lambda df, signal, value: df[signal] < value
        '<=': lambda df, signal, value: df[signal] <= value
        '==': lambda df, signal, value: df[signal] == value
        '>=': lambda df, signal, value: df[signal] >= value
        '>': lambda df, signal, value: df[signal] > value
        '!=': lambda df, signal, value: df[signal] != value
    }
    return cases[comparator](df, signal, value)
相关问题