小于或大于比较作为Python中的变量

时间:2014-04-28 18:59:57

标签: python comparison-operators

我在函数中有一块代码进行了一些比较,即:

if customer_info['total_dls'] < min_training_actions \
or customer_info['percentage'] > train_perc_cutoff:
    continue
elif customer_id not in test_set \
or test_set[customer_id]['total_dls'] < min_testing_actions:
    num_uncertain +=1
    continue
elif test_set[customer_id]['percentage'] <= test_perc_cutoff:
    num_correct +=1
else:
    num_incorrect +=1

现在有时我需要将这些比较大于,有时我需要它们小于。所有其余代码完全相同。现在,我可以创建两个基本上重用相同代码的函数,但在此之前,是否有一些简洁的方法来变换比较运算符,所以我可以使用相同的代码块并将比较作为变量传递?类似于:compare(var1, var2, polarity)我知道我自己可以做到这一点,但我想知道这样的情况下的标准是什么。是否有一些非常pythonic的做法,我不知道?

[编辑]重点强调问题的最重要部分[/编辑]

3 个答案:

答案 0 :(得分:8)

您可以使用operator module;它具有充当比较运算符的函数:

import operator

if foobar:
    comp = operator.lt
else:
    comp = operator.gt

if comp(spam, eggs):

如果spam小于或等于eggs,则会使用此测试,具体取决于foobar的真实情况。

这完全符合您的比较作为变量的要求。

这当然是我用来避免重复自己的东西;如果您在比较方向上有两段不同 的代码,请使用operators中的函数来参数化比较。

答案 1 :(得分:1)

我不会通过任何方式使运算符动态来重构这一点。我认为比较并不是那么相似,并且迫使它们看起来更相似,使代码混淆。这有点像红鲱鱼。

我会把复杂的检查放在一个函数中,比如

def customer_trained_enough(customer_info):
    return (
        customer_info['total_dls'] < min_training_actions
        or customer_info['percentage'] > train_perc_cutoff)

def customer_tested_enough(test_info):
    return test_info['total_dls'] >= min_testing_actions

def percentage_too_high(test_info):
    return test_info['percentage'] > test_perc_cutoff

然后代码变为:

if customer_trained_enough(customer_info):
    continue
if (customer_id not in test_set or
    not customer_tested_enough(test_set[customer_id])):
    num_uncertain += 1
elif not percentage_too_high(test_set[customer_id]):
    num_correct += 1
      else:
    num_incorrect += 1

我猜到了这些函数的一些名称,并且不得不否定其中两个函数的逻辑以使名称有用。

答案 2 :(得分:0)

在尝试为未知ML模型构建模块时,我遇到了同样的问题。有些需要执行最低分,其他则需要最高分,具体取决于使用的指标。我通过了一个超过&#39;布尔变量并写了一个小函数:

def is_better(gt,a,b): 
    return a>b if gt else a<b